宏保存下次运行的值

宏保存下次运行的值

我需要一个宏,将字符串(如标签的内容)保存到辅助文件中。在下一次运行期间,应该有一个宏检查该字符串是否在上次运行中设置过。

我迄今为止提出的解决方案如下:

\documentclass{minimal}
\usepackage{etoolbox}

\makeatletter
\def\csxdefaux#1{%
    \protected@write\@mainaux{}{%
        \expandafter\string\expandafter\xdef\expandafter\string\csname #1\endcsname{}%
    }%
}
\makeatother

\begin{document}
    \ifcsdef{setValue}{value set}{value \emph{not} set}
    \csxdefaux{setValue}

    \ifcsdef{strange:value}{strange value set}{strange value \emph{not} set}
    \csxdefaux{strange:value}
\end{document}

经过多次编译后,结果如下: 在此处输入图片描述

\csxdefaux因此,尽管和宏对\ifcsdef显然适用于普通字符串,但对于包含特殊字符的字符串却不起作用。

有什么好的方法可以实现与我的解决方案相同的效果,但又支持多种特殊字符,如冒号、数字、变音符号?

答案1

这个问题与 无关\ifcsdef,因为它测试正确并给出了正确的答案。要了解原因,我们需要查看文件.aux。根据您的定义,.aux文件内容为

\relax 
\xdef\setValue{}
\xdef\strange:value{}

然后 LaTeX 将其读回已定义\setValue(按要求),并\strange读回分隔宏(错误)。后者:此时会像“其他”字符一样发生,并且当您将某些内容写入文件时,您之前的标记化会丢失。

因此,您需要的是文件\csname ...\endcsname内部的构造.aux。一个工作定义是

\def\csxdefaux#1{%
    \protected@write\@mainaux{}{%
        \string\expandafter\string\gdef
          \string\csname\string\detokenize{#1}\string\endcsname{}%
    }%
}

或使用etoolbox包装器

\def\csxdefaux#1{%
    \protected@write\@mainaux{}{%
        \csgdef{\detokenize{#1}}{}%
    }%
}

#1在读回时已将其解除标记,以防类似的东西babel使任何事物变得活跃。(我不确定你为什么有\xdef,所以改用\gdef。)

相关内容