在命令内部全局修改命令

在命令内部全局修改命令

我见过几个有点类似的问题,但没有一个有相似的结构,或者 - 我会诚实的 - 没有一个答案能够让我足够理解以适应我的情况。

背景是,我有一份长文档,其中一些图形经常重复,但带有不同的标签和标题。

我创建了一个“主命令”(\pptFigure),用于文本中。这是一个创建图形的包装器。 给出的三个变量之一\pptFigure是“子命令”(在最小工作示例中\pptOne\pptTwo),其中包含图形的实际内容。

我的问题是,我希望子命令重新定义主命令将使用的命令(或变量)。在 MMWE 中,它被称为\pptTitle

\pptTitle在子命令和主命令中都可以使用,但是其内容仅在子命令中才正确。换句话说,我需要子命令来全局重新定义它。

我确信\expandafterand/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}

在此处输入图片描述

相关内容