我正在用定制版的歌本包由于大多数歌曲多次使用相同的副歌,我创建了一个非常简单的宏\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}