我理解\foreach
循环会创建一个组,而本地定义当然是本地的。
有没有办法跳过一层作用域?我的意思是我希望在循环内部进行局部更改,使其在外部可见,但不希望使其真正成为全局更改。
我正在工作newcommand
,我有一个局部变量,我不希望它成为全局变量。
梅威瑟:
\documentclass[12pt,a4paper]{article}
\usepackage{pgffor}
\newcommand{\mycommand}{%
\def\myvar{X} % local
\foreach \v in {1, ..., 3}{
(\v;\myvar)
\global\def\myvar{W}
}
-- in mycommand: \myvar % I need this updated
}
\begin{document}
\mycommand
myvar: \myvar % I wish for an 'undefined control sequence' here...
\end{document}
添加一\begingroup ... \endgroup
对并没有什么区别,因为\global
它确实完成了设计的目的。
此外,我知道这不是什么大问题,但是我的好奇心和结构化编程灵魂迫使我问这个问题!
答案1
这是可行的,只要您不想\myvar
在循环内使用原始含义(如果有)。
TeX 对某些未定义的事物非常满意\let
,因此第一条指令保留原来的含义(可能没有),而最后一条指令恢复它。
\documentclass[12pt,a4paper]{article}
\usepackage{pgffor}
\newcommand{\mycommand}{%
\let\jandermyvar\myvar
\def\myvar{X} % local
\foreach \v in {1, ..., 3}{
(\v;\myvar)
\global\def\myvar{W}
}
-- in mycommand: \myvar % I need this updated
\let\myvar\jandermyvar
}
\begin{document}
\mycommand
myvar: \myvar % I wish for an 'undefined control sequence' here...
\end{document}
另一方面,最好不要混淆含义:在循环中使用不同的名称。
根据您的实际需要,有不同的方法可以避免循环中的全局声明。