可分解填空

可分解填空

有什么好办法可以创建占据一行剩余空间的空白(最好是带下划线的——打印文档时要手写填写)。空白可能出现在行首、行中或行末;也可能占据整行。

我希望有一个解决方案,能够在改变周围文本的字体和字体大小以及页面和页边距的大小的情况下继续存在。

更新:我正在寻找一种使用 Knuth 的 TeX 和普通 TeX 的解决方案。

更新2:我发现 egreg 的建议空格有最小长度很好。但是,在这种情况下,如果空格可以跨行拆分(当然是自动拆分),那么在空格太长而无法放在当前行中,并且必须拆分空格(因为它比行长,或者因为该行上的文本太短,如果不处理会导致框未满)的情况下,将空格拆分成多行会非常方便。

更新 3

我需要的填空类型:

1)指定固定长度的不可分解空白;(egreg 已经为这种情况提供了一个优雅的解决方案这里

2) 特定固定长度的可断裂毛坯;

3) 可断空格,长度不短于指定的最小长度。这些空格与类型 2 的空格相同,只是断空格的最后部分(或未断空格时为整个空格)应扩展并占据其行上的所有可用空间(如\hrulefill)。

答案1

如果您需要将具有给定大小的下划线空间分成行尾的两部分(各部分的总和大约等于给定的大小),那么有一个解决方案:

\newcount\tmpnum \newdimen\tmpdim

\def\uelement{\hbox{\vrule height-1pt depth1.4pt width5pt}\penalty0 
    \hskip0pt minus.1pt \relax}
\def\softelement{\leaders\vrule height-1pt depth1.4pt\hskip 0pt plus5pt\relax}

\def\underlined#1{\bgroup
  \tmpdim=#1 \divide\tmpdim by327680 \tmpnum=\tmpdim
  \leavevmode \softelement
  \loop \ifnum\tmpnum>0\advance\tmpnum by-1 \uelement \repeat
  \softelement \egroup
}

First \underlined{5cm} second.

First \underlined{20cm} second.

\bye

破损下划线空格

上面的代码实现了可破坏空白的类型 2,如问题的更新 3 中所述。类型 3 可以通过添加 \ufill 宏来简单实现:

\def\ufill{\leaders\vrule height-1pt depth1.4pt \hfill}.

First \underlined{5cm}\ufill second.

First \underlined{20cm}\ufill second.

答案2

仅适用于纯 TeX:宏\filltoend将填充一行。

  • 如果参数为空,则不需要最小宽度(可以为零),
  • 如果参数非空,则它应该是所需的最小长度。
\def\filltoend#1{%
  \leavevmode % in case it's at the beginning of a line
  \hbox{}% something not discardable
  \nobreak % no line break here
  \leaders\hrule\hskip \if\relax#1\relax 0pt \else #1\fi plus 1fill\relax % the rule
  \hbox{}% something not discardable
}

\parindent0pt

Here is some text \filltoend{} to the end

\filltoend{}

\filltoend{}

Some more text that goes up to the end of the line which
is not as long as the first but is far too short \filltoend{}

Some more text that goes up to the end of the line which
is not as long as the first but is far too short \filltoend{2cm}

\bye

请注意,在最后一种情况下,整行都被填满,因为后面没有文本。

在此处输入图片描述

相关内容