我有以下文档设置:
\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.