如何生成按字母顺序排列的元素列表

如何生成按字母顺序排列的元素列表

我正在使用 为每首歌曲编写一本私人歌本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}

相关内容