如何对齐 dashrule?

如何对齐 dashrule?

我一直在玩破折号规则包。但正如手册中所示,我没有从虚线中获得正确的对齐或宽度。

\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,它将被转换为\xleadersTeX 原语;如果是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 的:这个答案不正确!

相关内容