这个问题与如果可能的话,如何将引文归属右对齐,并与引文在同一行?
我目前正在使用 TeXBook 的优秀解决方案,它是该问题中描述的解决方案之一,除了间距略有变化(引用和归属之间的间隙为 1em 而不是 2em):
\def\attr#1{{\unskip\nobreak\hfil\penalty50
\hskip1em\hbox{}\nobreak\hfil\itshape---#1
\parfillskip=0pt \finalhyphendemerits=0 \par}}
然而,又出现了一个问题:我把这段文字设置为两列,但有些属性最终会分成多行。右对齐的话,这看起来有点傻:
一般来说,如果需要多行的话,我更愿意将属性从左对齐开始放在新行上:
我需要一个自动化解决方案,因为我正在以编程方式生成文本。之后我会做一些手动调整,但由于我要排版超过 10,000 个条目,因此任何可以自动正确处理大部分条目的方法都可以节省大量时间。
答案1
etoolbox
这是我使用和尝试的calc
:
\usepackage{etoolbox}
\usepackage{calc}
\newlength\attrlength
\def\attr#1{
\setlength{\attrlength}{\widthof{#1}}
\ifdimcomp{\attrlength}{<}{\columnwidth}
{\shortattr{#1}}
{\longattr{#1}}}
\def\shortattr#1{{\unskip\nobreak\hfil\penalty50
\hskip1em\hbox{}\nobreak\hfil\emph{---#1}
\parfillskip=0pt \finalhyphendemerits=0 \par}}
\newcommand\longattr[1]{\par\noindent\emph{---#1}}
\newcommand\longattrnobreak[1]{\hspace{1em}\emph{---#1}}
我们将其设置\attrlength
为参数的宽度(即我们要设置为属性的文本),然后如果它小于列的宽度,我们将使用问题中描述的 TeXBook 的宏;否则我们开始一个新段落并在那里设置文本。
最后一个宏,\longattrnobreak
用于当归因与引文在同一行开始但此后左对齐时条目看起来更好的情况下:
我想不出一个干净的、易于实施的启发式方法(从我五分钟的思考来看,它涉及引文最后一行的宽度和归因最后一行的宽度,以及该行的宽度与其上方的宽度相比),所以如果前两个选项的自动选择看起来不好,我会在校对时手动选择这个。