我正在写一本歌曲集。目录应该包括乐曲名称和相应的作曲家。
这就是我现在的做法:
...
\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}