将动态命令名称写入辅助文件

将动态命令名称写入辅助文件

我有一组 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

相关内容