我可以在 \foreach 循环内更改 \def 而不使其对整个文档可见吗?

我可以在 \foreach 循环内更改 \def 而不使其对整个文档可见吗?

我理解\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}

另一方面,最好不要混淆含义:在循环中使用不同的名称。

根据您的实际需要,有不同的方法可以避免循环中的全局声明。

相关内容