定义随字体大小变化而缩放的长度

定义随字体大小变化而缩放的长度

我注意到字体大小变化时长度的行为,我希望有办法规避这种情况。考虑这个 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}%
}

其中#1LS(添加错误检查例程)。然后你可以说

\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 技巧划分维度以获得计数

相关内容