检测自定义包中的过时辅助文件

检测自定义包中的过时辅助文件

我正在编写自定义包,并尝试使用辅助文件进行一些两遍排版。妙语是我的包渲染了一些文本块,这些文本块的宽度都需要等于最大文本块的宽度。我目前的方法是:

  • 从辅助文件获取初始宽度(若不存在则为 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}

相关内容