包含两部分的目录(标题和作曲家)

包含两部分的目录(标题和作曲家)

我正在写一本歌曲集。目录应该包括乐曲名称和相应的作曲家。

这就是我现在的做法:

...
\newcommand{\titlecomponist}[2]{{#1}\hfill{#2}}
...
\begin{document}
\tableofcontents
\section[\titlecomponist{Hey Jude}{The Beatles}]{\songtitle{Hey Jude}}
%rest of the page...
\section[\titlecomponist{Smile}{David Gilmour}]{\songtitle{Smile}}

在目录中,我同时显示两者,而在页面本身上只显示歌曲标题。问题是,“\hfill”将组件文本设置为与标题的一定距离,因此位置取决于歌曲标题的长度。但我希望组件位于页面上的固定位置,就像表格一样。

到目前为止,我发现的唯一解决方案是手动创建上述表格,解析我的内容并对其进行 \newpage。但是,这会违背 \tableofcontents 的目的,因为它不会自动生成。而且我无法这样做,因为我实际上只是编写了一个 Python 脚本,该脚本会逐个文件将简单的输入转换为 LaTeX。实施此解决方案会使事情变得复杂,我无法接受这样一个事实:没有用于固定页面位置的 \hfill 或更简单的 TOC 双列解决方案。

不幸的是,我只找到了关于将整个目录分成两列、将整个文本段落放在固定位置的帖子,而 ChatGPT 为我提供了上述过于复杂的表格解决方案。为了避免混淆,我希望它在 mcs Word 中看起来像这样: 在此处输入图片描述

\documentclass{article}
\usepackage{xcolor}
\usepackage[T1]{fontenc}
\usepackage{tgbonum}
\usepackage{geometry}
\usepackage{titlesec}
\usepackage{titletoc}

\definecolor{titleColor}{HTML}{EDAA25}
\definecolor{composerColor}{HTML}{1D594E}

\definecolor{chordColor}{HTML}{0A7373}
\definecolor{textColor}{HTML}{4D4D4D}
\definecolor{commentColor}{HTML}{F2C12E}

\newcommand{\songtitle}[1]{{\LARGE\bfseries\color{titleColor}#1}}
\newcommand{\composer}[1]{\hspace{1.35em}\small\color{composerColor}#1}

\newcommand{\ch}[1]{{\bfseries\color{chordColor}#1}}
\newcommand{\tx}[1]{\color{textColor}#1}
\newcommand{\com}[1]{\small\color{commentColor}#1}

\renewcommand{\contentsname}{Inhalt}
\titleformat{\section}{\normalfont\Large\bfseries}{}{2em}{}
\titlespacing{\section}{-10pt}{0pt}{0pt}


\newcommand{\titlecomponist}[2]{{#1}\hfill{#2}}

\titlecontents{section}[0em]
  {\addvspace{1em}}
  {\contentslabel[\thecontentslabel]{2em}}
  {\titelkomponist}
  {\hfill\contentspage}
  [\addvspace{0.5em}]

\geometry{
  left=2.5cm,
  right=3cm,
  top=2cm,
  bottom=2cm, 
}

\begin{document}
\tableofcontents
\newpage



%NEW SONG: C:\Users\cleme\OneDrive\code\liederbuch\input\Hey Jude.txt
\twocolumn

\section[\titlecomponist{Hey Jude}{The Beatles}]{\songtitle{Hey Jude}}

\composer{The Beatles}\\

%paragraph
\begin{tabular}{l}

\begin{tabular}{l@{}l@{ }l@{ }l}
\multicolumn{4}{l}{\com{Verse 1}}\\
\\[-0.5em]\ch{}&\ch{F}&\ch{G}&\ch{C}\\
\tx{}&\tx{Hey Jude, }&\tx{don't make it }&\tx{bad}
\end{tabular}\\

\begin{tabular}{l@{ }l@{ }l}
\\[-0.5em]\ch{}&\ch{C7}&\ch{F}\\
\tx{Take a }&\tx{sad song and make it }&\tx{better}
\end{tabular}\\

%about 300 more lines of this

\end{tabular}\\\\

\onecolumn
\newpage
%NEW SONG: C:\Users\cleme\OneDrive\code\liederbuch\input\Smile.txt
\twocolumn

\section[\titlecomponist{Smile}{David Gilmour}]{\songtitle{Smile}}

\composer{David Gilmour}\\

%paragraph
\begin{tabular}{l}

\begin{tabular}{l@{}l@{ }l@{ }l@{ }l}
\multicolumn{5}{l}{\com{Intro 2x}}\\
\\[-0.5em]\ch{}&\ch{C}&\ch{CM7}&\ch{Am}&\ch{CM7}\\

\end{tabular}\\

\end{tabular}\\\\

%paragraph
\begin{tabular}{l}

\begin{tabular}{l@{}l@{ }l}
\multicolumn{3}{l}{\com{Verse 1}}\\
\\[-0.5em]\ch{}&\ch{C}&\ch{CM7}\\
\tx{}&\tx{Would this }&\tx{do}
\end{tabular}\\

\begin{tabular}{l@{ }l@{}l}
\\[-0.5em]\ch{}&\ch{C}&\ch{CM7}\\
\tx{To }&\tx{make it all-}&\tx{right}
\end{tabular}\\

\begin{tabular}{l@{}l@{ }l}
\\[-0.5em]\ch{}&\ch{C}&\ch{D}\\
\tx{}&\tx{While sleep has}&\tx{ taken you}
\end{tabular}\\

\begin{tabular}{l@{ }l@{ }l}
\\[-0.5em]\ch{}&\ch{C}&\ch{CM7}\\
\tx{Where }&\tx{I´m out }&\tx{ of sight}
\end{tabular}\\

\end{tabular}\\\\

%another 200 lines of this

\onecolumn
\newpage
\end{document}

答案1

第一步是将所有文本放入等宽框中,并\hfill占用多余的空间。请注意使用\string以防止宏过早扩展。

我发现将所有内容放入一个命令(\mysection)更容易,这样您只需输入一次参数。

下一步是计算标题和组件的最大宽度。最后,将这些宽度复制到辅助文件中(参见\AtEndDocument)。

我不确定为什么\shorttitle需要宏,但事实确实如此。

\documentclass{article}

\newlength{\maxtitle}
\setlength{\maxtitle}{0pt}
\newlength{\maxcomponist}
\setlength{\maxcomponist}{0pt}

\edef\finaltitle{\the\dimexpr 0.35\textwidth}% will be replaced during \begin{document}
\edef\finalcomponist{\the\dimexpr 0.35\textwidth}

\newcommand{\mysection}[2]{% #1=title, #2=composer
\bgroup% measure widths
  \sbox0{#1}%
  \ifdim\wd0>\maxtitle\relax \global\maxtitle=\wd0 \fi
  \sbox1{#2}%
  \ifdim\wd1>\maxcomponist\relax \global\maxcomponist=\wd1 \fi
  \def\shorttitle{\string\makebox[\string\finaltitle][l]{#1}\string\hfill
    \string\makebox[\string\finalcomponist][l]{#2}\string\hfill}
  \section[\shorttitle]{#1}%
\egroup}

\makeatletter
\AtEndDocument{%
  \immediate\write\@auxout{\string\gdef\string\finaltitle{\the\maxtitle}}%
  \immediate\write\@auxout{\string\gdef\string\finalcomponist{\the\maxcomponist}}%
}
\makeatother

\begin{document}
%\finaltitle\par\finalcomponist

\tableofcontents
\mysection{Hey Jude}{The Beatles}

\mysection{Smile}{David Gilmore}

%\the\maxtitle\par\the\maxcomponist
\end{document}

相关内容