考虑以下代码片段:
\documentclass{article}
\usepackage{xparse}
% \usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\NewDocumentCommand{\edeftest}{m}{\edef\test{#1}#1}
\NewDocumentCommand{\edeftestii}{m}{\edef\testii{#1}#1}
\def\yy#1{inserted by yy -#1- inserted by yy}
\NewDocumentCommand{\zz}{m}{inserted by zz -#1- inserted by zz}
\DeclareRobustCommand{\robusttest}{robust}
\newwrite\txt
\immediate\openout\txt=\jobname.txt
\begin{document}
\edeftest{test - \yy{argument of yy}}\par
\edeftestii{test - \zz{argument of zz}}\par
\immediate\write\txt{\test}
\immediate\write\txt{\testii}
\show\test
\show\testii
\edeftest{test - \yy{argument of yy} - diacritics: á\'a - \robusttest}\par
\edeftestii{test - \zz{argument of zz} - diacritics: á\'a - \robusttest}\par
\immediate\write\txt{\test}
\immediate\write\txt{\testii}
\show\test
\show\testii
\immediate\closeout\txt
\end{document}
第一次运行\edeftest
写入(我)预期的行为:\test
宏定义为test - inserted by yy -argument of yy- inserted by yy
,如\show\test
执行时所示。第一次运行\edeftestii
不扩展\zz
宏;我不想要那样。
\edeftest
和的第二次运行\edeftestii
更糟糕。两个变音符号(á
和)都以扩展语义\'a
写入\test
和\testii
宏(以及 txt 文件) ,即除非我们在前言中取消注释 T1 字体编码包,在这种情况下,两个重音“a”字符都在编码中,而不是在编码中,我猜是因为这不是 Unicode 引擎。使用和编译这些字符被视为没有问题:宏和文件都包含。这对我来说很好,但我希望有一种使用编译此行为的方法。TeX
\unhbox \voidb@x (...) \accent (...)
iso-8859-1
UTF8
pdfLaTeX
XeLaTeX
LuaLaTeX
UTF8
.txt
áá
pdfLaTeX
最后,在第二个测试集中,健壮宏将预期但不受欢迎的\protect
原语插入到.txt
文件中。
我想要什么?最终目标是拥有一个txt
文件,其内容尽可能接近完全展开的宏\test
和\testii
/或用户插入到\edeftest
宏中的任何参数。尽可能接近意味着最接近编译文档的文本,因此例如,如果从文件中删除一些排版更改(\bfseries
, \textbf
, \fontsize
),那就没问题了txt
。这可能吗?我知道在编写辅助文件时我们有一些限制,这就是为什么我强调“更接近”这个词。
如何\edeftest
定义才能实现这一点?
我知道这个技巧\begingroup\edef{\endgroup
,但在这里用不了。几年前我也问过一个相关问题 [1],在那种情况下它对我有用,但在这里却没用。