本地组中 edef 定义的变量范围(在 ifx 条件内)?

本地组中 edef 定义的变量范围(在 ifx 条件内)?

考虑一下这个MWE:

\documentclass{article}

\def\testswitch#1{
  \def\isA{A}
  \def\firstOpt{#1}
  \edef\tmpstr{-init-}
  { % start local
    \edef\tmpstr{-loc defined-}
  } % end local
  \ifx\firstOpt\isA{%
    \typeout{testswitch: Condition A is true; '#1'}
    \edef\tmpstr{yes, it is}
  }\else{
    \typeout{testswitch: Condition false ; '#1'}
    \edef\tmpstr{no it is not}
  }\fi
  \typeout{testswitch: completed, tmpstr is '\tmpstr'}
}

\def\testswitcher#1{
  \begingroup
  \testswitch{#1}
  \typeout{testswitcher: completed, tmpstr is '\tmpstr'}
  \endgroup
}

\begin{document}

\def\tmpstr{-master start-}
\testswitcher{A}
\typeout{after testswitcher, tmpstr: '\tmpstr'}
\testswitcher{B}
\typeout{after testswitcher, tmpstr: '\tmpstr'}

\end{document}

它输出:

testswitch: Condition A is true; 'A'
testswitch: completed, tmpstr is '-init-'
testswitcher: completed, tmpstr is '-init-'
after testswitcher, tmpstr: '-master start-'
testswitch: Condition false ; 'B'
testswitch: completed, tmpstr is '-init-'
testswitcher: completed, tmpstr is '-init-'
after testswitcher, tmpstr: '-master start-'

基本上,当 \tmpstr 在任何本地组中定义时 - 包括在条件使用过程中出现的本地组\ifx(因为,正如我记得的,{}\bgroup和的同义词\egroup) - 那么它不会在本地组之外产生任何影响;因此我们总是打印出'-init-'值。

我知道我可以在本地组内使用\global\edef( \xdef) 或变体 ( \global\let\tmpstr\tmpstr) 来保留值 - 但是,它会变成全局变量 - 在这种情况下,我不想要那样;我只希望\edef'd 标记能够在使用它的上下文中存活下来 - 在这个 MWE 中,这就是\testswitcher宏;我基本上想要这个输出:

testswitch: Condition A is true; 'A'
testswitch: completed, tmpstr is 'yes, it is'
testswitcher: completed, tmpstr is 'yes, it is'
after testswitcher, tmpstr: '-master start-'

我可以在 Latex 中控制这个级别的变量范围吗?如果可以,如何控制?

答案1

语法是

\ifx\a\b
 stuff
\else
other stuff
\fi

并且不暗示分组。通过

\ifx\a\b{
 stuff
}\else{
other stuff
}\fi

您在本地团体中保留了两个分支。

%还要注意,如果您不想在输出中引入空格,那么您将丢失很多行尾。

相关内容