考虑一下这个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
您在本地团体中保留了两个分支。
%
还要注意,如果您不想在输出中引入空格,那么您将丢失很多行尾。