如何在纯 TeX 中严格截断长行

如何在纯 TeX 中严格截断长行

我正在使用纯 TeX,想要排版包含数百个 URL 的附录。当 URL 超出右边距时,我希望 TeX 停止打印(即不进入边距,不打印警告黑色矩形),然后在新的(非缩进)行中从 URL 停止的位置继续打印其余部分。

像这样,其中 1、2、3 类似于脚注编号:

1: http://www.aaa.com/rem
ainder 2: http://www.bbb.
com/remainder_again  3: h
ttp://www.ccc.com/ending

这可能吗?

我使用 Python 脚本生成 .tex 文件,因此,如果情况最坏,我可以让 Python 估算每行的内容。不幸的是,我没有使用等宽字体,所以这可能会变得非常难看。

提前致谢。

答案1

由于您使用 Python 生成 TeX 代码,因此一种选择是用 分隔每个字符\hskip0pt。例如:

\def\a{a\hskip0pt}
\def\b{\a\a\a\a\a\a\a\a\a\a}
\def\c{\b\b\b\b\b\b\b\b\b\b}
\def\d{\c\c\c\c\c\c\c\c\c\c}

\d

答案2

LaTeXurl包可以与普通的 TeX 一起使用miniltx(当然,您也可以复制最少的代码)。例如

\input miniltx %
\input url.sty %
\urlstyle{rm}
\def\UrlBreaks{\do\/\do\a\do\b\do\c\do\d\do\e\do\f\do\g\do\h\do\i\do\j\do\k\do\l\do\m\do\n\do\o\do\p\do\q\do\r\do\s\do\t\do\u\do\v\do\w\do\x\do\y\do\z\do\A\do\B\do\C\do\D\do\E\do\F\do\G\do\H\do\I\do\J\do\K\do\L\do\M\do\N\do\O\do\P\do\Q\do\R\do\S\do\T\do\U\do\V\do\W\do\X\do\Y\do\Z}
\hsize 4.4cm %
\noindent
1.~\url{http://www.aaa.com/remainder}
2.~\url{http://www.bbb.com/remainder_again}
3.~\url{http://www.ccc.com/ending}
\bye

将让你使用建议的方法在任何角色上打破url,并且强制在 \url 中换行。事情取决于行宽:在上面的例子中,由于“正常”空格很少,因此很难避免框过满,并且相当于 LaTeX 的\sloppy可能还需要与 LaTeX 相当的东西,例如

\tolerance 9999 %
\emergencystretch 3em %

我认为我们必须允许休息到处:如果可以避免的话,这通常不是一个好计划。

要了解发生了什么,请注意url(ab)使用数学模式允许在“任何地方”中断,将任何可中断的 URL 字符变成 URL 内的 mathbin 字符。

答案3

TeXbook 中的第 14 章“TEX 如何将段落拆分成行”解释了连字符,即 TeX\discretionary{\char\hyphenchar\font}{}{}在每个允许的单词分隔符处插入\hyphenchar一个 0-255 之间的数字,因此将其设置为-1禁用连字符,现在我们要“手动​​”\discretionary{}{}{}在每个字符之间插入。这看起来很可怕,但使用普通的 TeX 宏很容易,甚至不需要标记寄存器。

\def\ub@{\discretionary{}{}{}}
\def\appe@#1#2\eol{\def\g{#2}%
\ifx\g\empty #1\else\ub@#1\appe@#2\eol\fi}
\def\protol@#1://#2\eol{#1:\kern-1.5pt/\kern-2.5pt/\appe@#2\eol}
\def\url#1{\begingroup\count0=\the\hyphenchar\font%
\hyphenchar\font=-1%
\protol@#1\eol
\hyphenchar\font=\count0\endgroup}

工作马是\appe@宏,它将字符串中的第一个字符作为,将#1字符串的其余部分直到标记\eol作为#2,并循环在它们之间插入\ub@直到#2变为空。请注意使用%以防止结果中出现多余的空格。\protol@宏只是我用来防止在 url 的协议部分中断(https://例如),并使://更紧凑一点。并且\begingroup不会重置\hyphenchar,所以记得将其设置回去。

[1] American Cornhole League. ``American Cornhole League Rules and
Regulations,'' November 13, 2019. Available:
\url{https://mysqlvm.blob.core.windows.net/acl-docs/ACL-Rules-Regs-2019-2020.pdf}.
[Accessed: April 17, 2024]\par
[2] American Cornhole Organization. ``Cornhole Rules,'' [online document].
Available:
\url{https://americancornhole.com/downloads/ACO-Season16/ACO-Cornhole-Rules-Sheet1.pdf}.
[Accessed: April 17, 2024]\par

用于引用,得 10 分

如果长 URL 跨越整行,最好在周围添加额外的粘连,/以便 TeX 可以稍微拉伸行以使其适合。请注意,粘连本身将允许 TeX 在其处换行。

\def\appe@#1#2\eol{\def\g{#2}%
\ifx\g\empty #1\else\ifx#1/\hskip-.5pt plus 1pt/\hskip-1pt plus 1pt%
\else\discretionary{}{#1}{#1}\fi\appe@#2\eol\fi}

引用 12pt

答案4

我们可以创建一个宏,在每个打印字符后插入 \hskip0pt plus1pt。此空间可拆分且可稍微拉伸,因此段落对齐在两个边距处均保持不变,并且长 URL 可在任意位置拆分。

\newcount\urlnum
\def\url#1{\global\advance\urlnum by1 $^{\the\urlnum}$%
   \bgroup\tt \urlA#1\end}
\def\urlA#1{\ifx#1\end\egroup\else
   \string#1\hskip0pt plus1pt\relax\expandafter\urlA\fi}

\hsize=7cm
\noindent Test: 
\url{http://www.aaa.com/remainder}
\url{http://www.bbb.com/remainder_again}
\url{http://www.ccc.com/ending}

\bye

相关内容