我最近在写论文时注意到一个微妙的问题:启用 savetrees 后,当你在运行的文本中使用 \tt 时,LaTeX 会切换到等宽字体前插入单词间空格,但当它返回到当前字体时,它会使用该字体的单词间空格。如果您改用 \texttt,等宽文本前后的空格都将在等宽字体中设置。
这是一个简单的例子:
\documentclass{article}
\usepackage[subtle]{savetrees}
\begin{document}
You should use the {\tt mkdir} command to create directories.
You should use the \texttt{mkdir} command to create directories.
\end{document}
得出的结果为:
“mkdir” 之后的空格差异很明显。如果你仔细观察,你会注意到两行中的空格前“mkdir” 也比其他单词之间的空格更宽(例如在“use the”中)。
注释掉 savetrees 可以解决此问题;无论使用哪种排版方法,“mkdir”周围的间距都会与其他单词之间的间距相同。
我试验了一下,发现我可以在 {\tt mkdir} 前面使用 \hspace{0pt},以使 savetrees 使用当前字体的空白设置。(实际上我使用的是 \hspace{0pt}\nolinebreak,因为它都在宏内。)但这似乎是一个丑陋的黑客行为。我尝试使用 {} 作为更干净的选项,但没有效果。
那么:(1) 这是 savetrees 的一个错误吗?(2) 有没有更好的方法来解决它?我希望“mkdir”两侧都有现有字体的空格,因为在我看来这样看起来更好,而且空格也不在更改后的字体内。
答案1
这不是一个解决方案,而是一个带有不太令人满意的解决方法和第二个可怕的解决方法的解释。
基本问题不在于savetrees
但microtype
。最初,我以为这一定与 有关word spacing
,但却一无所获。问题实际上是由 引发的tracking
。因此,一种解决方法是使用savetrees
但禁用此特定选项。
要查看问题,您可以跟踪tracking
文档savetrees
中非常简单的代码。该选项是使用实现的microtype
,但前提是我们生成的是 PDF,并且 LuaTeX 不是引擎。
以下相当于savetrees
使用subtle
并仅tracking
启用进行加载。
\documentclass{article}
\usepackage[letterspace=-25]{microtype}
\newcommand \sttest{%
You should use the {\tt mkdir} command to create directories and not use {\tt\textbackslash tt}!\par
You should use the {\ttfamily mkdir} command to create directories and not use {\ttfamily\textbackslash tt}!\par
You should use the \texttt{mkdir} command to create directories and not use \texttt{\textbackslash tt}!\par
You should use the \texttt{mkdir}{} command to create directories and not use \texttt{\textbackslash tt}!\par
}
\begin{document}
\sttest
{\lsstyle
\sttest}
\SetTracking[
spacing={-25*,,},
outer spacing={-25*,,},
outer kerning={0,0},
]{encoding=*}{-25}
{\lsstyle
\sttest}
\end{document}
解决方法 1
savetrees
与所有选项一起使用除了 tracking
。
\documentclass{article}
\usepackage[subtle,tracking=normal]{savetrees}%,tracking=tight
\usepackage{microtype}
\newcommand \sttest{%
You should use the {\tt mkdir} command to create directories and not use {\tt\textbackslash tt}!\par
You should use the {\ttfamily mkdir} command to create directories and not use {\ttfamily\textbackslash tt}!\par
You should use the \texttt{mkdir} command to create directories and not use \texttt{\textbackslash tt}!\par
You should use the \texttt{mkdir}{} command to create directories and not use \texttt{\textbackslash tt}!\par
}
\begin{document}
\parindent=0pt
\sttest
{\lsstyle
\sttest}
\end{document}
显然,如果您随后使用字母间距,您将得到一个奇怪的结果,但大概您可以\lsstyle
在实际文档中省略它。(不建议将其用于一般用途,但仅适用于大写字母/小型大写字母和特殊情况。)这将使用更多纸张(但当然在印刷上更胜一筹)。
解决方法 2
如果你真的致力于减少纸张,你可以在本地启用。我绝对不会这样做(但我也不使用)。如果您仍然希望这样做,您可以设置letter-spacing 模拟的选项,并使用在本地启用它savetrees
。tracking
savetrees
microtype
savetrees
tracking
\lsstyle
\documentclass{article}
\usepackage[subtle,tracking=normal]{savetrees}
\makeatletter
\usepackage[letterspace=\st@cspace@shrink]{microtype}
\makeatother
\newcommand \sttest{%
You should use the {\tt mkdir} command to create directories and not use {\tt\textbackslash tt}!\par
You should use the {\ttfamily mkdir} command to create directories and not use {\ttfamily\textbackslash tt}!\par
You should use the \texttt{mkdir} command to create directories and not use \texttt{\textbackslash tt}!\par
You should use the \texttt{mkdir}{} command to create directories and not use \texttt{\textbackslash tt}!\par
}
\begin{document}
\parindent=0pt
\sttest
{\lsstyle
\sttest}
\end{document}
但如果您对此没有异议,我怀疑您是否会问最初的问题......因此,解决方法 1 可能是更好的选择。