通过 \input 文件选择性地将 \global 应用于某些标记集

通过 \input 文件选择性地将 \global 应用于某些标记集

这应该很简单,但我猜不出需要的正确组合。应该\expandafter的值\MyTokenGlobal不是可以通过 更改\input,但 的值\MyTokenLocal应该会改变。以下代码生成:

在此处输入图片描述

期望的输出是: 在此处输入图片描述

笔记:

  • ,是必要的\begingroup\endgroup这样我才可以选择哪些令牌通过 受到影响\input
  • 使用 ,其中xdef有 会\edef产生正确的结果,但我认为如果 的值在我使用它\TempTokenLocal之后和之前发生变化,这可能会有问题\MyInput。因此,请求不使用 的解决方案\xdef

代码:

\documentclass{article}

\newtoks{\MyTokenGlobal}
\newtoks{\MyTokenLocal}

%\usepackage{filecontents}% Commented to protect overwriting foo.tex
\begin{filecontents}{foo.tex}
    \MyTokenGlobal={Global XXX}
    \MyTokenLocal={Local}
\end{filecontents}

\MyTokenGlobal={Global}
\MyTokenLocal={Local XXX}

\newcommand*{\TempTokenLocal}{}% Temporary variable
\newcommand*{\MyInput}[1]{%
    \begingroup%
        \input{#1}%
        \edef\TempTokenLocal{\the\MyTokenLocal}% Don't want to use \xdef here.
        \global\MyTokenLocal={\TempTokenLocal}% <-- Need \expansion magic here I think.
    \endgroup%
}%
    
\begin{document}

BEFORE: 
MyTokens = ``\the\MyTokenGlobal/\the\MyTokenLocal"

\MyInput{foo}

AFTER: 
MyTokens = ``\the\MyTokenGlobal/\the\MyTokenLocal"

\end{document}

答案1

\documentclass{article}

\newtoks{\MyTokenGlobal}
\newtoks{\MyTokenLocal}

%\usepackage{filecontents}% Commented to protect overwriting foo.tex
\begin{filecontents}{foo.tex}
    \MyTokenGlobal={Global XXX}
    \MyTokenLocal={Local}
\end{filecontents}

\MyTokenGlobal={Global}
\MyTokenLocal={Local XXX}

\newcommand*{\MyInput}[1]{%
    \begingroup%
        \input{#1}%
        \global\MyTokenLocal=\expandafter{\the\MyTokenLocal}% <-- Need \expansion magic here I think.
    \endgroup%
}%

\begin{document}

BEFORE: 
MyTokens = ``\the\MyTokenGlobal/\the\MyTokenLocal"

\MyInput{foo}

AFTER: 
MyTokens = ``\the\MyTokenGlobal/\the\MyTokenLocal"

\end{document}

相关内容