通过命令重复上一个环境

通过命令重复上一个环境

我正在用定制版的歌本包由于大多数歌曲多次使用相同的副歌,我创建了一个非常简单的宏\refChorus,只需打印出[合唱]定义如下:

\newcommand*{\refChorus}{\textsf{\textbf{[Chorus]}}}

非常基础。在歌本包中,合唱部分包含在合唱团环境。现在我的问题来了:

是否可以LaTeX更改\refChorus命令以重复最后的合唱?从实现角度来看,我猜我只需定义一个变量,该变量会随着每次合唱的发生而更新,以保存该环境的内容,然后定义一个命令来打印出这个变量。不幸的是,我不知道如何做到这一点。

我想重新定义命令,\refChorus所以这个代码

\begin{SBChorus}
    This is chorus 1
\end{SBChorus}
\refChorus
\refChorus

\begin{SBChorus}
    This is chorus 2
\end{SBChorus}
\refChorus

输出

这是合唱1

这是合唱1

这是合唱1

这是合唱2

这是合唱2

编辑:我被要求提供一个可编译的示例。就是这样:

\documentclass[12pt]{book}
\usepackage[chordbk]{songbook} 

\newcommand*{\refChorus}{\textsf{\textbf{[Chorus]}}}

\begin{document}
    \begin{song}{Songtitle} %Songtitel
        {} %in my version of songbook I am not using this
        {} %or this
        {Composer} 
        {Album} 
        {Year} 

        \begin{SBChorus}
            Chorus with a \Ch{C}{chord}
        \end{SBChorus}

        \refChorus %this just outputs [Chorus] but it should just repeat the last chorus (ideally the first chorus of a song if there's multiple in one song)

    \end{song}

    \begin{song}{Title Song 2} %Songtitel
        {} %in my version of songbook I am not using this
        {} %or this
        {Composer} 
        {Album} 
        {Year} 

        \begin{SBChorus}
            Chorus 2 with a \Ch{G}{chord}
        \end{SBChorus}

        \refChorus %this just outputs [Chorus] but it should just repeat the last chorus (ideally the first chorus of a song if there's multiple in one song)

    \end{song}

\end{document}

答案1

下面的宏重新定义了环境,SBChorus使得它

  • 将其内容存储在宏中,然后如果不使用可选参数则\lastChorus使用该宏\refChorus
  • 将其内容存储在作为环境的可选参数给出的名称下SBchorus,然后可以使用\refChorus该名称作为可选参数。

在此处输入图片描述

\documentclass{article}
\usepackage[wordbk]{songbook}
\usepackage{environ,ifthen}
\let\origSBChorus\SBChorus
\let\origendSBChorus\endSBChorus
\RenewEnviron{SBChorus}[1][]%
  {\global\let\lastChorus\BODY
   \ifthenelse{\equal{#1}{}}%
     {}%
     {\expandafter\global\expandafter\let\csname BODY:SBchorus:#1\endcsname\BODY}%
   \origSBChorus\lastChorus\origendSBChorus
  }
\newcommand\refChorus[1][]%
   {\origSBChorus
    \ifthenelse{\equal{#1}{}}%
      {\lastChorus}%
      {\csname BODY:SBchorus:#1\endcsname}
    \origendSBChorus
   }
\begin{document}
\begin{SBChorus}[main]% chorus gets label "main"
    This is chorus 1
\end{SBChorus}
\refChorus      % refers to the last chorus
\refChorus[main]% refers to the chorus labeled "main" (which happens to be last chorus)

\begin{SBChorus}
    This is chorus 2
\end{SBChorus}
\refChorus      % refers to the last chorus (which is the second one)
\refChorus[main]% refers to the chorus labeled "main" (which was the first one)
\end{document}

相关内容