\dotfill 具有最小长度

\dotfill 具有最小长度

我想构建一个 \dotfill 命令,在其中可以指定最小长度。我尝试过:

\makebox[0.88em]{\dotfill}\dotfill

由于点填充的标准间距为 0.44em,所以我得到的正好是两个点。但是,前两个点与第二个 \dotfill 命令中的点之间的间距略大。

有人知道我该如何解决这个问题吗?

答案1

您可以复制用更大的自然尺寸跳过\dotfill替换的定义:\hfill

在此处输入图片描述

\documentclass{article}

%\def\dotfill{%
%  \leavevmode
%  \cleaders \hb@xt@ .44em{\hss.\hss}\hfill
%  \kern\z@}
%  \MakeRobust\dotfill

\DeclareRobustCommand\mydotfill{%
  \leavevmode
  \cleaders \hbox to.44em{\hss.\hss}\hskip .88em plus 1fill
  \kern0pt }


\begin{document}

1 a\dotfill b

2 a\dotfill b\hspace{0pt  plus 1filll}c

{\parfillskip=.5\textwidth minus .5\textwidth

3 a\dotfill b

}

4 a\mydotfill b

5 a\mydotfill b\hspace{0pt  plus 1filll}c

{\parfillskip=.5\textwidth minus .5\textwidth

6 a\mydotfill b

}
\end{document}

答案2

这是一个 XY 问题。David 的回答完全解决了您的问题(修复最少的点,然后 +1),但不是您想要的(找到一个具有 0-1 个点的点线的好解决方案)。

我的水晶球说,固定最少的点并不是你想要的,因为以这种方式强制做事会产生很大的Overfull \hbox(参见 MWE 的黑色部分)。

我的水晶球无法看到的是,您认为还有什么其他解决方案适合这些情况,因为这取决于很多内容和个人喜好。

一个简单的解决方案是将“a”和/或“b”括在\parboxes 中,以确保 a+b 不会占用超过\linewidth-0.88em

另一个更复杂的(需要运行两次!)是检查 a+b 的宽度是否小于这个(至少将 b 作为宏的参数),这样你就可以使用标准\dotfill,否则就做……你认为更好的事情。例如,MWE 中的修复方法是将“b”部分移动到下一行,并使用半虚线。

MWE 还表明,省略花括号({})将仅将下一个字符作为第一个参数,因此当“b 部分”是一个单词或句子时,它可能会产生错误的结果。

姆韦

\documentclass[a6paper,draft]{article}
\usepackage[margin=1in,showframe]{geometry}
\usepackage{linegoal,xcolor,lipsum}
\parindent0pt\parskip0pt
\newlength\ihave
\newlength\remain
\newlength\ineed

\begin{document}
\DeclareRobustCommand\mydotfill{%
  \leavevmode
  \cleaders \hbox to.44em{\hss.\hss}\hskip .88em plus 1fill
  \kern0pt }

No argument (fake \verb-\dotfill-):

\rule{.75\linewidth}{1.5ex} \mydotfill b\par
\rule{.85\linewidth}{1.5ex} \mydotfill b\par
\rule{.95\linewidth}{1.5ex} \mydotfill b\par

\rule{.75\linewidth}{1.5ex} \mydotfill basic\par
\rule{.85\linewidth}{1.5ex} \mydotfill basic\par
\rule{.95\linewidth}{1.5ex} \mydotfill basic\par

\renewcommand\mydotfill[1]{%
\settowidth{\ihave}{#1}%
\setlength{\remain}{\dimexpr\linegoal}%
\setlength{\ineed}{\dimexpr\ihave+.88em}%
\ifdim\remain>\ineed \dotfill#1\else\\[-1ex]%
\mbox{}\hfill$\vdots$\dotfill#1\fi} 

\color{blue}

Argument  is next character   % better with curly braces ...

\rule{.75\linewidth}{1.5ex} \mydotfill b\par 
\rule{.85\linewidth}{1.5ex} \mydotfill b\par
\rule{.95\linewidth}{1.5ex} \mydotfill b\par 

\color{red}
But it should not :  % ...  because this

\rule{.75\linewidth}{1.5ex} \mydotfill basic\par 
\rule{.85\linewidth}{1.5ex} \mydotfill basic\par
\rule{.95\linewidth}{1.5ex} \mydotfill basic\par 

 \color{magenta}
Argument  is the next word/setence:

\rule{.75\linewidth}{1.5ex} \mydotfill{basic}\par 
\rule{.85\linewidth}{1.5ex} \mydotfill{basic}\par
\rule{.95\linewidth}{1.5ex} \mydotfill{basic approach method}\par 


\end{document}

相关内容