跳过正文
  1. Posts/

Latex的一些笔记

·200 字·1 分钟· loading · loading · ·

分类:

Latex

标签:

Tex Latex 中英竖排 直排 代码字体 段落标题 自定颜色 宏包选项 选项族
目录

前言
#

这是在制作 Latex 模板 的时候,遇到的一些问题,以及相应的解决方法。

盒子测量
#

要想测量某些东西的时候,一个方法是使用盒子将其包裹起来,然后测其长度。但要注意的是,在使用某个盒子之前,要先将要使用的长度数值保存下来。使用某个盒子之后,貌似无法直接测量。示例代码:

\documentclass{ctexart}
\begin{document}

    \newbox\mybox
    \setbox\mybox=\hbox{\fbox{盒子测试English}}
    
    
    高度是:\the\ht\mybox ,深度是:\the\dp\mybox ,宽度是:\the\wd\mybox 
    
    使用它们的值的时候,先将它们的值保存下来。
    \newdimen\h
    \h = \ht\mybox

    下面是盒子的演示:
    \box\mybox

    由于一些奇怪的原因,在使用某个盒子以后,它的值会被清空,无法被测量。
    所以要在使用它之前先将它们的值保存下来。下面是演示:


    盒子的高度是:\the\h\the\ht\mybox
\end{document}

中英竖排
#

用到竖排的原因在于要制作书脊。一开始的思路是创建一个很窄的盒子,每一行只能容得下一个字,字距通过行间距调节。这样就能创造出竖排的效果。但这有一个很大的问题就是当标题中含英文单词的时候,单词并不会竖排。

搜索后解决的思路就是:设置一个旋转的中文字体,然后再通过逆向旋转盒子来达到竖排的目的。

实例代码魔改自 David Carlisle 的回答,示例如下:

\documentclass{ctexart}
\usepackage{graphicx} % 旋转盒子
% 定义文章主要中文字体
\setCJKmainfont{SimSun}
% 定义文章中的旋转字体
\setCJKfamilyfont{songvert}[RawFeature={vertical:+vert}]{SimSun}
\newcommand*\CJKmovesymbol[1]{\raise.35em\hbox{#1}}
% 中英混竖排修正
\newcommand*\CJKmove{
    \let\backupCJKsymbol\CJKsymbol
    \let\backupCJKpunctsymbol\CJKpunctsymbol

    \let\CJKsymbol\CJKmovesymbol
    \let\CJKpunctsymbol\CJKsymbol
}
% 中英混横排恢复
\newcommand*\CJKrecover{
    \let\CJKsymbol\backupCJKsymbol
    \let\CJKpunctsymbol\backupCJKpunctsymbol
}
\begin{document} 
这是一个竖排的演示:
\begin{center}
    \rotatebox{-90}{
        \fbox{
            \begin{minipage}{10em}
            \CJKmove
            \CJKfamily{songvert}
            测试文字!\\
            Test Word!\\
            中文 English!\\
            \ziju{2}中文 English!
            \end{minipage}

        }
    }
\end{center}

\CJKmove
这是没有修复的中英混排:中文,English!


\CJKrecover
这是已经修复的中英混排:中文,English!
\end{document}

显示的效果如:

竖排显示效果

但这样只有一列中英混排时,会使得居中出现一些小问题。原因在于修改了 baseline,使得汉字在一行中并不处于中间,会被字母的「深度」撑高。这时就得手动修正。具体为测量其真实深度,使用 \hspace 使其偏移修正。

段落标题
#

要给段落加上标题,也就是所谓四级标题。直接使用:\paragraph{段落} 是不起作用的。这时要加上 \setcounter{secnumdepth}{4},才能使得段落标题起作用。

演示代码如下:

\documentclass{ctexart}
\setcounter{secnumdepth}{4}
\begin{document}
    \section{一级标题}
    \subsection{二级标题}
    \subsubsection{三级标题}
    \paragraph{段落}
\end{document}

代码显示
#

由于学院要求,英语单词使用的字体为:Times New Roman。所以无法在代码演示的字体,无法使用等宽字体。如果在代码环境之间使用上述字体,代码环境会强行按照等宽显示,造成显示效果不美观。这时可以通过设置来使得代码环境不按等宽显示。

以下是演示代码:

\documentclass{ctexart}
\usepackage{listings}

\begin{document}

Times New Roman 等宽显示代码:
\begin{lstlisting}[language=C, basicstyle=\fontfamily{Times New Roman}]
#include<stdio.h>
int main(void){
    printf("Hello World!");
    return 0;
}
\end{lstlisting}

Times New Roman 非等宽显示代码:
\begin{lstlisting}[language=C, basicstyle=\fontfamily{Times New Roman}, columns=fullflexible]
#include<stdio.h>
int main(void){
    printf("Hello World!");
    return 0;
}
\end{lstlisting}

使用等宽字体:
\begin{lstlisting}[language=C, basicstyle=\ttfamily]
#include<stdio.h>
int main(void){
    printf("Hello World!");
    return 0;
}
\end{lstlisting}
\end{document}

自定义颜色
#

自定义颜色有两种不同的定义:(调用的宏包为 xcolor)

\definecolor{ColorName}{rgb}{r,g,b}
\definecolor{ColorName}{RGB}{R,G,B}

第一种 rgb 的范围在 0 到 1,而第二种 RGB 的范围是 0 到 255。

宏包选项
#

自定义宏包增加一些自定义的功能。首先引入宏包:xkeyval

然后定义选项内容,以及要执行的代码:

\DeclareOptionX{选项名称}{执行代码}

选项族
#

可以实现在导言区自定义个人信息。

\define@key{族名}{选项名}[默认代码]{执行代码} % #1 为输入参数

修改参数时,代码为:

\setkeys{族名}{%
  选项名1 = 选项内容,
  选项名2 = 选项内容,
  % ……
}