我正在编写自定义包,并尝试使用辅助文件进行一些两遍排版。妙语是我的包渲染了一些文本块,这些文本块的宽度都需要等于最大文本块的宽度。我目前的方法是:
- 从辅助文件获取初始宽度(若不存在则为 0pt)
- 计算最大值(初始宽度,每个块的宽度)
- 排版
- 将最大宽度写入辅助文件
这基本上是可行的,但有一个问题:写入辅助文件的最大宽度永远不能以这种方式减小,因此如果从文档中删除最长的块,排版仍会继续使用其宽度,直到我删除辅助文件。
在我看来,解决此问题的正确方法是,如果 aux 文件比 tex 文件旧,则忽略 aux 文件中的宽度;这样,每次 tex 文件发生变化时,我都会从初始宽度 0pt 重新开始。最好的方法是什么?
平均能量损失
\RequirePackage{filecontents}
\begin{filecontents*}{mwe.sty}
\RequirePackage{calc}
\ProcessOptions\relax
\newlength{\maxwidth}
\newlength{\itemwidth}
\gdef\initmaxwidth{0pt}
\newcommand{\updatewidth}[1]{\settowidth{\itemwidth}{#1}\setlength{\maxwidth}{\maxof{\maxwidth}{\itemwidth}}\global\maxwidth=\maxwidth}
\newcommand{\mycmd}[1]{\updatewidth{#1}#1}
\AtBeginDocument{%
\setlength{\maxwidth}{\initmaxwidth}
}
\AtEndDocument{%
\immediate\write\@auxout{%
\gdef\string\initmaxwidth{\the\maxwidth}%
}
}
\endinput
\end{filecontents*}
\documentclass{article}
\usepackage{mwe}
\begin{document}
\mycmd{M}
\mycmd{I}
Max width is \the\maxwidth .
\end{document}
要使用此 MWE 进行复制,您必须先对此文件进行两次乳胶处理(您将获得最大宽度约为 9pt),然后将其更改为\mycmd{M}
,\mycmd{}
并重新乳胶处理该文件 - 请注意,最大宽度不会减少。
答案1
您基本上已经掌握了这些部分,只需再添加一个变量(我将使用\maxwiidthsofar
)来跟踪宽度,就好像您不知道辅助文件告诉了您什么一样。当您到达末尾时,将其与辅助文件告诉您的内容进行比较并做出相应的反应。
\documentclass{article}
\RequirePackage{calc}
\newlength{\maxwidth}
\newlength{\maxwidthsofar} % added
\newlength{\itemwidth}
\def\initmaxwidth{0pt}
\newcommand{\updatewidth}[1]{%
\settowidth{\itemwidth}{#1}%
\setlength{\maxwidth}{\maxof{\maxwidth}{\itemwidth}}%
\setlength{\maxwidthsofar}{\maxof{\maxwidthsofar}{\itemwidth}}% added
\global\maxwidth=\maxwidth%
}
\newcommand{\mycmd}[1]{\updatewidth{#1}#1}
\AtBeginDocument{%
\setlength{\maxwidth}{\initmaxwidth}
}
\makeatletter
\AtEndDocument{%
\immediate\write\@auxout{%
\gdef\string\initmaxwidth{\the\maxwidthsofar}% adjusted
}
\ifdim\maxwidthsofar=\initmaxwidth
\else
\typeout{^^JMax width changed. Rerun.^^J}
\fi
}
\makeatother
\begin{document}
\mycmd{M}
\mycmd{I}
Max width is \the\maxwidth .
\end{document}