我一直在玩破折号规则包。但正如手册中所示,我没有从虚线中获得正确的对齐或宽度。
\documentclass{article}
\usepackage{dashrule}
\begin{document}
\setlength{\parindent}{0mm}
\rule[0mm]{\linewidth}{1mm}
\hdashrule[0.5ex][x]{\linewidth}{0.5pt}{1.5mm}
\hdashrule[0.5ex][c]{\linewidth}{0.5pt}{1.5mm}
\rule[0mm]{\linewidth}{1mm}
\end{document}
我希望最左边的破折号位于左边距,最右边的破折号位于右边距 - 意思是:加宽间隙 - (参数 [x])或左右边距剩余空间相等(参数 [c])。 两者都应该可以。
答案1
您可以使用领导者来做到这一点,但您可以让 TeX 计算当它们之间添加最小间隙时可以容纳多少个破折号副本,并用这个最小间隙替换来\hfill
掩盖您的踪迹。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\fillwithdashes}{O{}m}
{
\group_begin:
\keys_set:nn { musicman/dashes } { #1 }
\hbox_set:Nn \l_musicman_dash_box
{
\rule[\l_musicman_height_dim]{\l_musicman_width_dim}{\l_musicman_thickness_dim}
}
\dim_set:Nn \l_musicman_target_dim { #2 - \box_wd:N \l_musicman_dash_box }
\dim_set:Nn \l_musicman_piece_dim
{
\box_wd:N \l_musicman_dash_box + \l_musicman_gap_dim
}
\leavevmode
\box_use:N \l_musicman_dash_box
\prg_replicate:nn
{
\int_div_truncate:nn { \l_musicman_target_dim } { \l_musicman_piece_dim }
}
{ \hfill \box_use:N \l_musicman_dash_box }
\group_end:
}
\keys_define:nn { musicman/dashes }
{
thickness .dim_set:N = \l_musicman_thickness_dim,
height .dim_set:N = \l_musicman_height_dim,
width .dim_set:N = \l_musicman_width_dim,
min-gap .dim_set:N = \l_musicman_gap_dim,
thickness .initial:n = 0.4pt,
height .initial:n = 0pt,
width .initial:n = 1.5mm,
min-gap .initial:n = 1.5mm,
}
\box_new:N \l_musicman_dash_box
\dim_new:N \l_musicman_target_dim
\dim_new:N \l_musicman_piece_dim
\ExplSyntaxOff
\begin{document}
\setlength{\parindent}{0mm}
\hrule height 1pt
\strut\fillwithdashes[height=0.5ex,width=1.5mm,min-gap=1mm,thickness=0.4pt]{\linewidth}
\hrule height 1pt
\bigskip
\hrule height 1pt
\strut\fillwithdashes{\linewidth}
\hrule height 1pt
\end{document}
答案2
如果将x
作为第二个可选参数传递给\hdashrule
,它将被转换为\xleaders
TeX 原语;如果是c
,您将获得 TeX 的\cleaders
;如果不带任何内容,您将获得 TeX 的\leaders
,这正是您想要的。
以下是代码:
\documentclass{article}
\usepackage{dashrule}
\begin{document}
\setlength{\parindent}{0mm}
\rule[0mm]{\linewidth}{1mm}
\hdashrule[0.5ex][x]{\linewidth}{0.5pt}{1.5mm}
\hdashrule[0.5ex][c]{\linewidth}{0.5pt}{1.5mm}
\hdashrule[0.5ex]{\linewidth}{0.5pt}{1.5mm}
\hdashrule[0.5ex]{\linewidth}{0.5pt}{1.5mm}
\hdashrule[0.5ex]{\linewidth}{0.5pt}{1.5mm}
\rule[0mm]{\linewidth}{1mm}
Making it more visible:
\rule[0mm]{\linewidth}{1mm}
\hdashrule[0.5ex][x]{\linewidth}{0.5pt}{2mm 7mm}
\hdashrule[0.5ex][c]{\linewidth}{0.5pt}{2mm 7mm}
\hdashrule[0.5ex]{\linewidth}{0.5pt}{2mm 7mm}
\hdashrule[0.5ex]{\linewidth}{0.5pt}{2mm 7mm}
\hdashrule[0.5ex]{\linewidth}{0.5pt}{2mm 7mm}
\rule[0mm]{\linewidth}{1mm}
\end{document}
哦,这里还有输出:
添加(错误,见下文)
原帖者澄清了他们的问题(见评论)。好吧,有时一些快速而简单的技巧就是最好的解决方案(或者至少是最简单的解决方案!):
\documentclass{article}
\usepackage{dashrule}
\newcommand*{\mydashedrule}[1]{%
\hdashrule[0.5ex][x]{\dimexpr\linewidth+#1\relax}{0.5pt}{#1}%
\nobreak\hspace{-#1}\null
}
\begin{document}
\setlength{\parindent}{0mm}
\rule[0mm]{\linewidth}{1mm}
\mydashedrule{6mm}
\mydashedrule{6mm}
\mydashedrule{6mm}
\mydashedrule{6mm}
\mydashedrule{6mm}
\rule[0mm]{\linewidth}{1mm}
\end{document}
输出如下:
事后想法
上述“快速而肮脏的伎俩”包含一个严重的错误,因为(从某种意义上说,这是显而易见的,而且TeXbook在第 224 页练习 21.4 之前的段落中进行了详细解释,这也与此相关)\xleaders
在第一个重复框之前和最后一个重复框之后也留有一些空白。这个空白的大小取决于要填充的空间\xleaders...\hskip
与重复框本身占据的总宽度之间的差值;这意味着,为了补偿这个量,你必须以某种方式测量整个构造应该填充的空间宽度。换句话说,我认为这个问题唯一正确的答案是 egreg 的:这个答案不正确!