我需要一个宏,将字符串(如标签的内容)保存到辅助文件中。在下一次运行期间,应该有一个宏检查该字符串是否在上次运行中设置过。
我迄今为止提出的解决方案如下:
\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
。)