我注意到字体大小变化时长度的行为,我希望有办法规避这种情况。考虑这个 MWE:
\documentclass{article}
\begin{document}
\newlength\mylength
\mylength=\baselineskip
\def\stringmylength{\the\baselineskip}
mylength~~~ baselineskip~~~ stringmylength\\
\the\mylength~~~~~~~~\the\baselineskip~~~~~~~~~~~~~\stringmylength\\
\Large
\the\mylength~~~\the\baselineskip~~~~~~~\stringmylength\\
\end{document}
输出如下:
当我以可缩放单位定义长度时(此处为\baselineskip
,尽管如果我定义为 2.7871ex 也会出现相同的行为\mylength
),我希望在更改字体大小时,它会缩放。但\mylength
事实并非如此。我似乎记得在某处读到过长度被转换为某个内部 LaTeX 单位,这也许可以解释为什么一旦指定长度,它就不会随字体大小缩放。
然而,很明显某些长度确实可以缩放,例如\baselineskip
,如我的例子所示。
另外,我可以通过将长度存储为字符串而不是长度(\stringmylength
在我的示例中)来“解决”该问题,尽管这对我来说似乎很粗鲁。
有没有办法定义随着字体大小变化而缩放的 LaTeX 长度?
如果不是,那么手动修改长度以适应字体大小变化的规定方法是什么?
[编辑:正如对 David 的评论中所提到的,并被 egreg 所接受,这个问题涉及包中长度的公式化stackengine
]
答案1
在您的软件包文档中推荐诸如这样的语法\Sstackgap=0.7ex
是有争议的;标准 LaTeX 语法使用\setlength
并且由于\Sstackgap
是跳过寄存器(因为您用 定义它\newlength
),这会导致奇怪的错误;用户输入
\Sstackgap=0.3ex Plus other things
会对奇怪的错误信息感到困惑Missing number treated as 0
。你知道为什么吗?
em
如果您希望以基于字体的单位或尊重当前字体来表示此长度ex
,则必须将其视为宏:
\newcommand{\setstackgap}[2]{%
\@namedef{#1stackgap}{#2}%
}
其中#1
是L
或S
(添加错误检查例程)。然后你可以说
\newcommand\stackgap{%
\@nameuse{\if S\stacktype S\else L\fi stackgap}\relax
}
用户可以说
\setstackgap{S}{.7ex}
\setstackgap{L}{.3em}
或者其他。或者,定义一个\stackengineset
宏:
\newcommand{\stackengineset}[2]{\def#1{#2}}
因此用户可以输入
\stackengineset{\Sstackgap}{0.7ex}
请注意,两种方式都可以指定固定长度。
你可以\Sstackgap=0.7ex
使用如下语法
\def\Sstackgap{\afterassignment\@foo\skip@}
\def\@foo{\edef\@Sstackgap{\the\skip@}}
并修改\stackgap
为使用\@Sstackgap
而不是\the\Sstackgap
; 类似地用于\Lstackgap
。但我不推荐这种方式,因为它违反了标准的 LaTeX 语法。
答案2
它可能很“粗俗”,但这就是您应该做的:将其存储为宏。
\baselineskip
做不是自动更改,存储每个字体大小的基线在宏定义中每次字体改变时,都会在宏baseline
中设置长度。\selectfont
答案3
根据 David Carlisle 的回答,某些“可扩展”长度变化(例如 的长度\baselineskip
)发生在 内\selectfont
,我想知道这种修改 的方法是否有问题\selectfont
?它会破坏其他东西吗?它的表现会不会与我想象/希望的不同?
\mylength
它避免了保存为字符串的需要。
\documentclass{article}
\usepackage{fp}
\newcount\oldsize
\newcount\newsize
\newlength\mylength
\let\svselectfont\selectfont
\def\selectfont{%
\oldsize=\baselineskip\relax%
\svselectfont%
\newsize=\baselineskip\relax%
\FPdiv\result{\the\newsize}{\the\oldsize}%
\setlength\mylength{\result\mylength}%
}
\begin{document}
\mylength=\baselineskip
\def\stringmylength{\the\baselineskip}
\baselineskip=\the\baselineskip
mylength~~~ baselineskip~~~ stringmylength\\
\the\mylength~~~~~~~~\the\baselineskip~~~~~~~~~~~~~\stringmylength\\
\Large
\the\mylength~~~\the\baselineskip~~~~~~~\stringmylength\\
\end{document}
向 egreg (通过 percusse) 致敬,他提供了 counter=length 技巧划分维度以获得计数