为什么在 tikz 和 figure 中使用嵌套环境时变量为空

为什么在 tikz 和 figure 中使用嵌套环境时变量为空

我有以下文档设置:

\documentclass[a4paper]{article}

\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{graphicx}
\usepackage{tikz}

\begin{document}
\newenvironment{foo}{
  \newcommand\bara{}
  \newcommand\barb[1]{
    \renewcommand\bara{##1}
    \typeout{FIRST}
    \typeout{##1}{\bara}
  }

  \newenvironment{baz}{
    \begin{figure}[!h]
    \centering
    \begin{tikzpicture}{scale=1}
  }{
    \typeout{SECOND}
    \typeout{\bara}
    \end{tikzpicture}
    \typeout{\bara}
    \caption{\bara}
    \end{figure}
  }
}{}

\begin{foo}
  \begin{baz}
    \bara{abc}
  \end{baz}
\end{foo}

\end{document}

它记录:

SECOND
[blank]

最后一行是空白的,缺少第一行内容。(并且 PDF 中的标题是空白的)。

\typeout我是乳胶的新手,除了将语句放入文档中之外,我不确定如何进行调试。

想知道为什么它没有记录:

FIRST
abc
SECOND
abc
abc

答案1

测试代码应该是

\begin{foo}
  \begin{baz}
    \barb{abc}
  \end{baz}
\end{foo}

因为它\barb设置了 的值\bara

问题出在哪里?baz环境打开了一个tikzpicture形成组的环境;\barb{abc}声明是在这个组内发出的tikzpicture,因此当环境结束时,它就不再可用了。

根据您的需要,可以通过设置来解决\bara 全球;如果需要的话,还可以通过一些较低级别的编程将值偷运上一级。

问题的概括性不足以提出选择。

答案2

此 MWE

\documentclass{article}
\makeatletter
\newenvironment{foo}%
{%
%
  \newcommand\@bar{}%
  \renewcommand\bar[1]{%
    \renewcommand\@bar{##1}%
    \typeout{FIRST}%
    \typeout{##1}{\@bar}%
  }%
%
  \newenvironment{baz}%
  {%
  }%
  {%
    \typeout{SECOND}%
    \typeout{\@bar}%
  }%
}%
{}%
\makeatother

\begin{document}
\begin{foo}
  \begin{baz}
    \bar{abc}
  \end{baz}
\end{foo}
\end{document}

似乎产生了正确的输出/日志

% latex tmp.tex
[snip]
FIRST
abc
SECOND
abc
[snip]
Output written on tmp.pdf (1 page, 11670 bytes).
Transcript written on tmp.log.

相关内容