我正在用纯 (Xe)TeX 创建一个模板,该模板的第一行必须包含位置和参考编号。位置左对齐,参考编号右对齐。(参见下面的示例 1。)
如果这两个都很短,我可以使用:
{\it Location}: UK \hfill {\it Ref}: Xyz
但是,如果其中任何一个太长,以致 TeX 无法将它们放入同一行,它就会将参考数字溢出到下一行(示例 2)。
通常这是处理一行中文本过多问题的最佳方法,但由于这些文档最终的外观,这不是我想要的。
我希望前半部分溢出到下一行,这样引用数就始终完全在第一行(示例 3)。如果引用数的大小始终是静态的,那么这将相对容易,但它可能会发生很大变化(例如示例 4)。
在纯 TeX 中是否有明显的方法来做到这一点?我想不出解决这个问题的好方法,除非将参考数字放在一个框中,计算其大小,从线宽中减去该数字,然后将另一个数字放入该宽度的框中,这似乎是一种相当复杂的方法。
任何有关方法的指示都非常感谢。谢谢!
答案1
我们可以使用\parshape
原始形状,以及不规则的右形状。该命令\parshape
后面必须跟一个整数n和n维度对;比如
\parshape 3
0pt 3cm
4pt \dimexpr 3cm+4pt\relax
8pt \dimexpr 3cm+8pt\relax
将给出一个段落形状,其中第一行从左边距开始,长度为 3cm,第二行从左边距右侧 4pt 开始,长度为 3cm+4pt,第三行向右推一点,长度稍长。第三行之后的行将遵循与第三行相同的规范。
在我们的例子中,我们需要零缩进,但第一行必须更短才能容纳引用。我们可以测量引用的宽度并添加间隙,例如 1em:
\setbox0=\hbox{{\it Ref\/}: #2}
我们将获得参考的宽度,因此
\parshape 2 0pt \dimexpr\hsize-1em\relax 0pt \hsize
将生成一个段落,留出所需的空间。
\def\entry#1#2{% #1 = location -- #2 = ref
\setbox0=\hbox{{\it Ref\/}: #2}%
\vbox{\parindent=0pt % no indent
\rightskip 0pt plus 6em % raggedright
\spaceskip .3333em \xspaceskip .5em\relax % no flexible space
\language255 % no hyphenation
\hsize=5.5cm % overall size
\parshape=2 0pt \dimexpr\hsize-\wd0-1em\relax 0pt \hsize
\leavevmode\rlap{\line{\hfil\box0}}{\it Location\/}: #1\par}}
\entry{UK}{Xyz}
\medskip
\entry{Oxford Street, UK}{Xyz}
\medskip
\entry{Oxford Street, UK}{Xxxx Yyyy Xyz}
\bye
还进行了一些调整:例如,\rightskip
比给出的更强\raggedright
(需要进行一些实验来找到最佳尺寸)。参考放在开头,\rlap{\line{\hfill\box0}}
以便与右边距齐平,但不占用空间。
答案2
你能用 吗\halign
?例如,如果你需要紧密的列并且可以换行,那么你可以\vbox
在序言中使用 :
\newdimen\locwd
\locwd=3cm
\newdimen\refwd
\refwd=3cm
\halign{\vbox{\parindent0pt\hsize\locwd\raggedright{\it Location\/}: #\hfil}&
\quad\hfil\vbox{\parindent0pt\hsize\refwd\raggedright{\it Ref\/}: #}\cr
UK& Xyz\cr
Oxford Street, UK& Xyz\cr
Oxford Street, UK& Xxxx Yyyy Zzz\cr
}
\bye
答案3
这是一个起点。未解决的问题是示例 4,因为我不知道如何使长引用向左延伸到地址块中。
为了演示目的,我将整体宽度限制为 8 厘米,但您可以轻松将其设置为\hsize
。
\documentclass{article}
\def\locref#1#2{\hbox to 8cm
{\vtop{\hsize=4cm\noindent\raggedright {\it Location:}\hfill #1}
\hfill\quad{\it Ref:} #2}}
\begin{document}
\locref{UK}{12345453}
\locref{London, Oxford Street, UK}{12345453}
\locref{London, Oxford Street, United Kingdom}{12345453}
\locref{London, Oxford Street, United Kingdom}{12345453-123454}
\locref{London, Oxford Street, United Kingdom}{12345453-12345453-12345453}
\end{document}