有没有办法测量一行文本的剩余空间?

有没有办法测量一行文本的剩余空间?

我想写以下内容:

Some long paragraph of text \measureremainder{\whatsleft}\begin{mimipage}{\whatsleft}
    stuff
\end{minipage}

这样 minipage 就正好占据了剩余的\hsizeminus \widthof{Some long paragraph of text}。我根据代码尝试了以下操作TeX 按主题分类

\newbox\linebox
\newbox\snapbox
\def\restofline#1{%
  \hfill\par\setbox\linebox\lastbox% Fill the line, then pop it off
  \ifvoid\linebox%
  \else%
  \unskip\unpenalty%
  \setbox\snapbox\hbox{\unhcopy\linebox}% and reset the line without expanding flexible spaces
  \setlength{#1}{\wd\linebox}% Then retrieve the difference between the two settings
  \addtolength{#1}{-\wd\snapbox}%
  \usebox\snapbox% and replace the line with the tightly-set one
  \fi%
}

\parindent在原始段落中,这种方法还算有效:如果段落只有一行,它将复制首字母。但如果我在 itemize 环境中尝试这样做,它就会完全失效:

\begin{itemize}
  \item Some text \measurerest{\whatsleft}\showthe\whatsleft
\end{itemize}

因为\lastbox在垂直模式下不起作用。

两种方法都不起作用:我尝试了\begin{minipage}{\textwidth plus -1fill},但 minipages 需要长度,而不是尺寸,因此会忽略拉伸因素。我也尝试了\hfill\setlength\whatsleft\lastskip,但返回的0.0pt plus 1.0fill不是SomeNumberOfpt

有没有办法绕过\lastbox-in-vertical 模式的限制?或者有更强大的方法强制 TeX 设置胶水以便可以测量?

答案1

您可以使用 TikZ 来实现这一点,方法是在其中放置一个空的 TikZ 图片,\measureremainder然后测量其位置到文本区域右边框的距离。这需要至少两次编译器运行才能工作。它重用了我的回答中的一些代码如何定义图形大小以使其占据页面的剩余部分?. 部分代码可能会作为 TeX.SX-TikZ 包的一部分发布。

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{calc}

\newcommand{\currentsidemargin}{%
  \ifodd\value{page}%
    \oddsidemargin%
  \else%
    \evensidemargin%
  \fi%
}

\newlength{\whatsleft}

\newcommand{\measureremainder}[1]{%
\begin{tikzpicture}[overlay,remember picture]
    % Helper nodes
    \path (current page.north west) ++(\hoffset, -\voffset)
        node[anchor=north west, shape=rectangle, inner sep=0, minimum width=\paperwidth, minimum height=\paperheight]
        (pagearea) {};


    \path (pagearea.north west) ++(1in+\currentsidemargin,-1in-\topmargin-\headheight-\headsep)
        node[anchor=north west, shape=rectangle, inner sep=0, minimum width=\textwidth, minimum height=\textheight]
        (textarea) {};

    % Measure distance to right text border
    \path let \p0 = (0,0), \p1 = (textarea.east) in
        [/utils/exec={\pgfmathsetlength#1{\x1-\x0}\global#1=#1}];

\end{tikzpicture}%
}


\begin{document}
\section{test}

Some long paragraph of text \measureremainder{\whatsleft}\begin{minipage}[t]{\whatsleft}
    \hrulefill
\end{minipage}

Some short text \measureremainder{\whatsleft}\begin{minipage}[t]{\whatsleft}
    \hrulefill
\end{minipage}

Some long long long long long long long long long long long long long
long long long long long long long long long long long text \measureremainder{\whatsleft}\begin{minipage}[t]{\whatsleft}
    \hrulefill
\end{minipage}

\end{document}

结果:

例子

(水平线代表的宽度minipage。)

更新2011/09/15:

我刚刚上传了新包tikzpagenodes转换为 CTAN,将上述代码简化如下:

\usepackage{tikzpagenodes}
\usetikzlibrary{calc}

\newcommand{\measureremainder}[1]{%
\begin{tikzpicture}[overlay,remember picture]
    % Measure distance to right text border
    \path let \p0 = (0,0), \p1 = (current page text area.east) in
        [/utils/exec={\pgfmathsetlength#1{\x1-\x0}\global#1=#1}];
\end{tikzpicture}%
}

答案2

zrefzref-savepos有保存标记位置的选项。在普通文本中,它工作得很好。在列表中,情况就不同了。中远海运解释如下:\item实际上不打印任何内容,也不开始新行。它保存包含项目符号的框,并安排\everypar在下一个段落开始时打印它,即在您标记当前位置之后(该位置就在即将到来的新行上方和左边距)。

该问题通过使用linegoal package(它zref在内部使用)来说明

\documentclass{article}
\usepackage{linegoal}
\begin{document}
This is a test \rlap{\rule[.5ex]{\linegoal}{0.5pt}}{}of line goal and all
kinds of everything else here and here again all kinds of everything else
here and here again
\begin{itemize}
  \item This is a test \rlap{\rule[.5ex]{\linegoal}{0.5pt}}{}of line goal
      and all kinds of everything else here and here again all kinds of
      everything else here and here again
\end{itemize}
\end{document}

答案3

您可以尝试 linegoal 包。

答案4

这是一个迟来的答案

\documentclass[12pt]{article}
\usepackage{tabto,calc}
\begin{document}
Some long paragraph ... \tabto{\CurrentLineWidth}%
\begin{minipage}[t]{\linewidth-\TabPrevPos}
   stuff stuff stuff ... stuff 
\end{minipage}

\end{document}

这样做似乎很愚蠢\tabto{\CurrentLineWidth},但这是用来进行测量的\TabPrevPos

相关内容