如何获取 \hfill 的宽度?

如何获取 \hfill 的宽度?

在我的 LaTeX 文档中,第一行使用 \hfill 获得给定的间距,然后是一个段落,然后是第三行,我想在其中使用与第一行相同的间距。

第一行类似于:

a\hfill b\hfill c\hfill d

我如何在第三行元素之间使用与\hfill第一行元素之间相同的间距? 以下示例不起作用,但显示了我想要实现的想法:

\newlength{\lengthofhfill}
a\hfill b\hfill c\hfill d\setlength{\lengthofhfill}{\widthof{\hfill}}

This is another paragraph.

e\hspace{\lengthofhfill}f\hspace{\lengthofhfill}g

我猜测一定有一个变量“知道”\hfill某处的长度,我只是不知道它是什么或如何使用它。

顺便问一句:有没有关于 TeX 这类低级问题的资源?除了 Google,我不知道该去哪里解决这些问题。我很想知道一个地方,让我可以大致了解它的实现方式\hfill,例如,在 LaTeX 文档和源代码级别之间的某个级别。

答案1

没有\hfill使用用于的大小的变量。

为了简单起见,不\parindent考虑这一点,您的第一个例子相当于说

\hbox to\hsize{a\hfill b\hfill c\hfill d}

TeX 测量盒子的“自然宽度”,就好像它是 一样\hbox{a{}b{}c{}d},因为 的自然宽度\hfill为零。然后,它计算请求的大小和这个自然宽度之间的差值,并将超出的部分平均分配给三个空间。

如果使用标准设置的 Plain TeX,宽度为\hbox{abcd}20.5556pt,而\hsize为 449.19939pt。因此每个空格的宽度为 149.73312pt。在其内部表示中,TeX 会有

\hbox(6.94444+0.0)x469.75499, glue set 149.73312fill
.\tenrm a
.\glue 0.0 plus 1.0fill
.\tenrm b
.\glue 0.0 plus 1.0fill
.\tenrm c
.\glue 0.0 plus 1.0fill
.\tenrm d

这样信息就可以看到,但是不是在编程层面上可用。

所以如果你必须使用这些信息,你必须用盒子来计算它:

\newdimen\usedhfill
\setbox0=\hbox{a{}b{}c{}d}
\usedhfill=\hsize
\advance\usedhfill by -\wd0
\divide\usedhfill by 3

笔记。为什么\hbox{a{}b{}c{}d}而不是?因为在后一种情况下,字母之间会发生字距调整,而在构建\hbox{abcd}时则不会发生。\hbox{a\hfill b\hfill c\hfill d}

答案2

本练习的关键是正确处理框。在下面的 MWE 中,我创建了与第一行中相应元素的宽度相匹配的框,但打印的内容有所不同,对齐方式也发生了一些改变。所有这些都可以通过以下命令实现\makebox[<width>][<alignment>]{<stuff>}

在此处输入图片描述

\documentclass{article}
\usepackage{calc}% http://ctan.org/pkg/calc
\newcommand{\lalign}[2]{\makebox[\widthof{#2}][l]{#1}}
\newcommand{\ralign}[2]{\makebox[\widthof{#2}][r]{#1}}
\newcommand{\calign}[2]{\makebox[\widthof{#2}][c]{#1}}
\begin{document}

abc \hfill defgh \hfill ij \hfill klmno

% Incorrect alignment
ab \hfill cdef \hfill ghijkl \hfill mno

% Correct alignment (left aligned)
\lalign{ab}{abc} \hfill \lalign{cdef}{defgh} \hfill \lalign{ghijkl}{ij} \hfill \lalign{mno}{klmno}

% Correct alignment (right aligned)
\ralign{ab}{abc} \hfill \ralign{cdef}{defgh} \hfill \ralign{ghijkl}{ij} \hfill \ralign{mno}{klmno}

% Correct alignment (centre aligned)
\calign{ab}{abc} \hfill \calign{cdef}{defgh} \hfill \calign{ghijkl}{ij} \hfill \calign{mno}{klmno}

\end{document}

上面,将 的宽度固定为 的\lalign{<stuff>}{<first>}宽度,同时还与的左侧对齐。类似地,使用右侧对齐,同时进入对齐。垂直规则只是为了视觉清晰而添加的。<stuff><first><stuff>l<first>\ralignr\calign c

calc提供了通过 来计算物体宽度的方法\widthof{<stuff>}


另一种获取方法是通过zref的模块。它允许您使用-类型系统savepos存储某物的 x(或 y,或两者)坐标。以下 MWE 构造部分取自\label\ref我想将下一行缩进指定的位置并进行调整以适应参数。\SP按顺序保存位置,从 1 开始,同时\UP{<num>}使用保存为数字的位置<num>

在此处输入图片描述

% Reference: https://tex.stackexchange.com/q/69051/5764
\documentclass{article}
\usepackage{zref-savepos}% http://ctan.org/pkg/zref
\makeatletter
% \zsaveposx is defined since 2011/12/05 v2.23 of zref-savepos
\@ifundefined{zsaveposx}{\let\zsaveposx\zsavepos}{}
\makeatother
\newcounter{hposcnt}
\renewcommand*{\thehposcnt}{hpos\number\value{hposcnt}}
\newcommand*{\SP}{% set position
  \stepcounter{hposcnt}%
  \zsaveposx{\thehposcnt s}%
}
\makeatletter
\newcommand*{\UP}[1]{% use previous position
  \zsaveposx{hpos#1u}%
  \zref@refused{hpos#1s}%
  \zref@refused{hpos#1u}%
  \kern\zposx{hpos#1s}sp\relax
  \kern-\zposx{hpos#1u}sp\relax
}
\makeatother
\begin{document}

abc \hfill \SP{}defgh \hfill \SP{}ij \hfill \SP{}klmno

% Incorrect alignment
ab \hfill cdef \hfill ghijkl \hfill mno

% Correct alignment (left aligned)
ab \UP{1}cdef \UP{2}ghijkl \UP{3}{mno}

\end{document}

但是,这种方法要慢得多,第一次至少需要 6 次编译才能使引用稳定下来。这是因为元素的每次调整都要延迟一个编译周期才能稳定下来。


还有tikzmark它通过 提供类似的功能\tikzmark,要求在 内完成放置tikzpicture(从而完全从图形的角度处理放置,并且需要更少的编译)。

答案3

您可以使用该包linegoal。请注意,您需要两个编译步骤。

\documentclass[a4paper]{article}
\usepackage{showframe}
\usepackage{linegoal}

\begin{document}
Text Text Text \rule{\linegoal}{2pt}

Text \the\linegoal

More more text more textText \the\linegoal
\end{document}

在此处输入图片描述

相关内容