我见过几个有点类似的问题,但没有一个有相似的结构,或者 - 我会诚实的 - 没有一个答案能够让我足够理解以适应我的情况。
背景是,我有一份长文档,其中一些图形经常重复,但带有不同的标签和标题。
我创建了一个“主命令”(\pptFigure
),用于文本中。这是一个创建图形的包装器。 给出的三个变量之一\pptFigure
是“子命令”(在最小工作示例中\pptOne
和\pptTwo
),其中包含图形的实际内容。
我的问题是,我希望子命令重新定义主命令将使用的命令(或变量)。在 MMWE 中,它被称为\pptTitle
。
\pptTitle
在子命令和主命令中都可以使用,但是其内容仅在子命令中才正确。换句话说,我需要子命令来全局重新定义它。
我确信\expandafter
and/or \makeatletter
+的某种组合\makeatother
可能是一个解决方案,但到目前为止我还不知道如何解决。
最小(更新)工作示例:
\documentclass[a4paper]{article}
\usepackage{fontspec}
\providecommand{\pptTitle}{empty}
\newcommand{\pptFigure}[3]{%
\begin{figure}
\centering
\fbox{%
\hspace{5mm}
\begin{minipage}[h]{0.85\textwidth}
\vspace{5mm}
#1
\vspace{5mm}
\end{minipage}
\hspace{5mm}
}
\caption{#2: \pptTitle}\label{#3}
\end{figure}%
}
\newcommand{\pptOne}{%
\gdef\pptTitle{Title one}
\begin{center}
{\large \pptTitle}
\end{center}
\begin{itemize}
\item Point
\item Point
\end{itemize}
}
\newcommand{\pptTwo}{%
\gdef\pptTitle{Title two}
\begin{center}
{\large \pptTitle}
\end{center}
\begin{itemize}
\item Point
\item Point
\end{itemize}
}
\begin{document}
First figure.\pptFigure{\pptOne}{captionPart1}{label1}
Second figure.\pptFigure{\pptTwo}{captionPart1}{label2}
\end{document}
答案1
minipage
这是一个装箱和分组问题——的外部\pptTitle
仍然是空的,但pptTitle
首先扩展(在使用副本并\let
重新定义\pptTitle
为\gdef
(扩展定义)之后)将在外部起作用。即使是\global\renewcommand
在这里也行不通。
minipage
是一个特殊的parbox
,因此它是一个盒子,即\(re)newcommand
定义在盒子内丢失,但\gdef
或\xdef
将继续存在。
\documentclass[a4paper]{article}
% \usepackage{fontspec}
\providecommand{\pptTitle}{empty}
\newcommand{\pptFigure}[3]{%
\begin{figure}
\centering
\fbox{%
\hspace{5mm}
\begin{minipage}[h]{0.85\textwidth}
\vspace{5mm}
#1%
\let\innerpptTitle\pptTitle
\gdef\pptTitle{\innerpptTitle}
\vspace{5mm}
\end{minipage}
\hspace{5mm}
}
\caption{#2: \pptTitle}\label{#3}
\end{figure}%
}
\newcommand{\pptOne}{%
\renewcommand{\pptTitle}{Title one}
\begin{center}
{\large \pptTitle}
\end{center}
\begin{itemize}
\item Point
\item Point
\end{itemize}
}
\newcommand{\pptTwo}{%
\renewcommand{\pptTitle}{Title two}
\begin{center}
{\large \pptTitle}
\end{center}
\begin{itemize}
\item Point
\item Point
\end{itemize}
}
\begin{document}
First figure.\pptFigure{\pptOne}{captionPart1}{label1}
Second figure.\pptFigure{\pptTwo}{captionPart1}{label2}
\end{document}
这是一个显示装箱问题的小例子
\documentclass{article}
\newcommand{\foo}{This is foo}
\begin{document}
\foo
\parbox{10cm}{\global\renewcommand{\foo}{This is bar}\foo}
\foo
\parbox{10cm}{\gdef\foo{This is bar inside with gdef}\foo}
\foo
\end{document}