前言 #
这是在制作 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 = 选项内容,
% ……
}