![将动态命令名称写入辅助文件](https://linux22.com/image/351000/%E5%B0%86%E5%8A%A8%E6%80%81%E5%91%BD%E4%BB%A4%E5%90%8D%E7%A7%B0%E5%86%99%E5%85%A5%E8%BE%85%E5%8A%A9%E6%96%87%E4%BB%B6.png)
我有一组 latex 文档。我想将一些 latex 命令输出到与每个文档对应的辅助文件中。所有这些辅助文件稍后将(连同它们的目录)用于编译单独的文档。MWE 文档如下 -
文件名 = maths.tex
\documentclass{book}
\newcommand{\tocabbreviation}{Something specific to the document}
\newcommand{\tocfn}[1]{Some command #1}
\usepackage{etoolbox}
%\include{preamble} % contains common commands, not needed in MWE
\edef\leftbracechar{\string{}
\edef\rightbracechar{\string}}
\ifdef{\tocabbreviation} {
\newwrite\myfile
\immediate\openout\myfile=\jobname_aux.tex
\immediate\write\myfile{\string\newcommand \leftbracechar \string\ \jobname tocfn\rightbracechar \leftbracechar \string\tocfn \leftbracechar \string\tocabbreviation\rightbracechar\rightbracechar}
\immediate\closeout\myfile
} { }
\begin{document}
abra ca dabra
\end{document}
我希望在 maths_aux.tex 中看到这个输出
\newcommand{\mathstocfn}{\tocfn{\tocabbreviation}}
这样,当我稍后编译一个新文件并在其中输入{maths_aux.tex} 时,我会得到一个定义的命令 mathstocfn。
我看到的是
\newcommand{\ mathstocfn}{\tocfn{\tocabbreviation}}
我该如何摆脱这个讨厌的空间?我尝试了各种建议 - textbackslash、backslashchar、宏等等。除了我想要的之外,它什么都做不了。
答案1
您可以使用
\expandafter\string\csname\jobname tocfn\endcsname
这将应用于\string
已形成的控制序列标记。我还更改了代码以写入的当前扩展\tocabbreviation
,否则它将丢失。
\documentclass{book}
\usepackage{etoolbox}
\newcommand{\tocabbreviation}{Something specific to the document}
\newcommand{\tocfn}[1]{Some command #1}
\ifdef{\tocabbreviation}{%
\newwrite\myfile
\immediate\openout\myfile=\jobname_aux.tex
\immediate\write\myfile{%
\string\newcommand{%
\expandafter\string\csname \jobname tocfn\endcsname
}{\string\tocfn{\unexpanded\expandafter{\tocabbreviation}}}%
}
\immediate\closeout\myfile
}{}
\begin{document}
abra ca dabra
\end{document}
文件内容magguu_aux.tex
:
\newcommand{\magguutocfn}{\tocfn{Something specific to the document}}
请注意,除非您打算编写不平衡的字符串,否则您不需要\leftbracechar
它。\rightbracechar
一个expl3
版本:
\documentclass{book}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\settocabbreviation}{m}
{
\magguu_write:xn { \exp_not:c { \c_sys_jobname_str tocfn } } { #1 }
}
\iow_new:N \g_magguu_toc_out_stream
\cs_new_protected:Nn \magguu_write:nn
{
\iow_open:Nn \g_magguu_toc_out_stream { \c_sys_jobname_str _aux.tex }
\iow_now:Nn \g_magguu_toc_out_stream { \newcommand{#1}{#2} }
\iow_close:N \g_magguu_toc_out_stream
}
\cs_generate_variant:Nn \magguu_write:nn { x }
\ExplSyntaxOff
\settocabbreviation{Something specific to the document}
\begin{document}
abra ca dabra
\end{document}
如果需要在文档中使用,可以添加\newcommand{\tocabbreviation}{#1}
代码。\settocabbreviation
\tocabbreviation