我正在使用 为每首歌曲编写一本私人歌本tcolorbox
。该tcolorbox
软件包提供了一个不错的界面,用于自动编号和创建 tcolorboxes 列表,甚至将其直接集成到目录中。
我怎么能够另外提供字母列表所有歌曲(tcolorboxes)的标题?
\documentclass[twoside]{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[utf8]{inputenc}
\usepackage[hidelinks]{hyperref}
\usepackage[breakable]{tcolorbox}
\newtcolorbox[auto counter, number within=section, list inside=toc]{song}[1]{before title={\textbf{\thetcbcounter}\quad}, title={#1}}
\renewcommand{\thesection}{\Alph{section}}
\begin{document}
\tableofcontents
\section{English Songs}
\begin{song}{Old MacDonald}
Old MacDonald....
\end{song}
\begin{song}{Happy Birthday}
Happy Birthday...
\end{song}
\begin{song}{Oh When The Saints}
Oh when the saints...
\end{song}
\section{German Songs}
\begin{song}{Alle meine Entchen}
Alle meine Entchen...
\end{song}
\begin{song}{Häschen in der Grube}
Häschen in der Grube...
\end{song}
\section{Alphabetical List of Songs}
But how?
\end{document}
答案1
把所有歌曲放入latex3序列,然后在文档末尾用命令打印出来\ListSongs
,从而产生:
宏\AllSongs
将打印文档中出现到该位置为止的所有歌曲。只需稍加努力,您就可以将所有歌曲保存到辅助文件(或“歌曲”文件),然后重新读入它们,这意味着完整的歌曲可以打印在文档的任何位置。
根据评论中的要求,我更新了歌曲列表的格式,现在它包括歌曲编号、歌曲标题和页码,类似于目录列表。歌曲标题和页码都是超链接。为了使其工作,我在环境after=\AddSong{#1}
定义中添加了songs
内容,它只是将当前歌曲的标题添加到歌曲列表中。为了使超链接在环境末尾工作,song
代码现在为每首歌曲添加标签,形式为songA.1
, songA.1
, ...。如果歌曲包含任何计数器等,这似乎不太可能,那么这些标签可能略有错误。
完整代码如下:
\documentclass[twoside]{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[utf8]{inputenc}
\usepackage[hidelinks]{hyperref}
\usepackage{enumitem}
\usepackage{xparse,expl3}
\ExplSyntaxOn
\seq_new:N \g_songs_seq
\NewDocumentCommand\AddSong{m}
{
\label{song\thetcbcounter}
\seq_gpush:Nx \g_songs_seq {{#1}{\thetcbcounter}}
}
\cs_new_protected:Nn \list_song:nn {
\item[#2]\hyperref[song#2]{#1}\dotfill\pageref{song#2}
}
\NewDocumentCommand\ListSongs{}
{
\seq_if_empty:NF \gongs_seq
{
% first sort the songs following
% https://tex.stackexchange.com/questions/333646
\seq_sort:Nn \g_songs_seq {
\int_compare:nTF { \pdftex_strcmp:D { ##1 } { ##2 } > 0 }
{ \sort_return_swapped: }
{ \sort_return_same: }
}
% print the list of songs in an itemize environment
\begin{enumerate}[nosep]
\seq_map_inline:Nn \g_songs_seq {\list_song:nn ##1}
\end{enumerate}
}
}
\ExplSyntaxOff
\usepackage[breakable]{tcolorbox}
\newtcolorbox[
auto counter,
number within=section,
list inside=toc
]{song}[1]{%
before title={\textbf{\thetcbcounter}\quad},
title={#1},
after=\AddSong{#1}
}
\renewcommand{\thesection}{\Alph{section}}
\begin{document}
\tableofcontents
\section{English Songs}
\begin{song}{Old MacDonald}
Old MacDonald....
\end{song}
\begin{song}{Happy Birthday}
Happy Birthday...
\end{song}
\begin{song}{Oh When The Saints}
Oh when the saints...
\end{song}
\section{German Songs}
\begin{song}{Alle meine Entchen}
Alle meine Entchen...
\end{song}
\begin{song}{Häschen in der Grube}
Häschen in der Grube...
\end{song}
\newpage
\section{Alphabetical List of Songs}
\ListSongs
\end{document}