我想构建一个 \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”括在\parbox
es 中,以确保 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}