表格边到边虚线:抑制过冲,减小点尺寸,将点与边缘对齐

表格边到边虚线:抑制过冲,减小点尺寸,将点与边缘对齐

我正在尝试在行后从表格的左边缘到右边缘添加虚线。我的最佳尝试存在 3 个问题(下面的代码和屏幕截图):1)虚线的长度等于小页面的宽度而不是表格的宽度,2)点并非恰好从表格的左边缘开始(有轻微的间隙),3)减小点的大小也会改变虚线的起点,进一步使具有不同点大小的线的起点不匹配(我希望有具有不同点大小的线,但所有线都从同一边缘开始和结束)。最左边点的左边缘应接触表格的左边缘(就像\hrule在第一行上使用的那样),最右边点的右边缘应接触表格的右边缘。我正在使用lualatex

注意:我在 stack exchange 上遇到过使用破折号而不是点的黑客,我正在寻找点,所以请不要发布任何破折号答案。另外,我暂时无法转移到另一个环境,所以它必须是tabular环境的解决方案。另外,请不要发布tikz或其他慢速绘制技巧。如果描述中不清楚:我不打算像那样手动指定表格长度n pt/cm/in,解决方案将能够像\hrule我对第一行使用的那样找出表格的长度。最后:鉴于 TUG 2020 对 PDF 标记和可访问性的重视,理想情况下,解决方案不会让 pdf-accessibility 文本转语音实用程序开始说无数次“点点点点点……”。

代码:

% >> lualatex table.tex
\documentclass[notitlepage,letterpaper]{article}
\usepackage{array}
\begin{document}

\begin{minipage}[t][1in][t]{3in}
    Hello world!\\
    \begin{tabular}[t]{@{}rll@{}}
            \noalign{\hrule height 0.5pt}
        a & some & text \\
            \noalign{\dotfill}
        b & some & other text \\
            \noalign{\dotfill}
        b & some more & text \\
            \noalign{\dotfill}
    \end{tabular}%
\end{minipage}

\end{document}

屏幕截图:(我打算从红色框的左边缘开始画较小的虚线,到右边缘结束(理想情况下是接触边缘的点)) 输出截图

答案1

改编自我的回答表格环境中使用虚线代替 \hline,以包含\xleaders而不是,以提高齐平度,并为每列边距提供可选的点包含,使其可以与列边距规范\leaders一起使用。此外,它现在适用于 2 列以上的。@{}tabular

为了更好地匹配左右边距,对改编版进行了另外两处编辑:

  1. 已将指定的边距与点联系起来。

  2. 最后需要右列字距减去一个\replength前导字距减去(无边距)点的宽度

如果需要,可以逐列更改\replength和的值。不幸的是,我无法将点构造为单个引线,而必须逐列处理。由于我使用来实现齐平,这意味着每列中的点间距将略有不同,具体取决于列宽和和的值。\dotscale\xleader\replength\tabcolsep

\documentclass{article}
\usepackage{graphicx}
\newlength\replength
\setlength\replength{1.3pt}% HORIZONTAL DOT SEP
\newcommand\dotscale{.5}% SCALES DOT SIZE
\newcommand\sidebearing{.9pt}% DOT'S SIDEBEARING
\newsavebox\mydot
\newcommand\tdotfill[1][\repfrac]{\xleaders\hbox to \replength{%
  \smash{\raisebox{\arraystretch\dimexpr\ht\strutbox-.1ex\relax}%
    {\usebox{\mydot}}}}%
  \hfill}
\newcommand\tdotleft[1][\tabcolsep]{%
  \makebox[0pt][r]{\makebox[#1]{\tdotfill}}}
\newcommand\tdotright[1][\tabcolsep]{%
  \makebox[0pt][l]{\makebox[#1]{\tdotfill}}}
\newcommand\tabdotline[1][Q]{%
  \savebox\mydot{%
    \scalebox{\dotscale}{\kern-\sidebearing.\kern-\sidebearing}}%
  \ifx l#1\relax\tdotleft\tdotfill\else
  \ifx r#1\relax\tdotfill\tdotright\else
  \ifx \relax#1\relax\tdotfill\else
  \tdotleft\tdotfill\tdotright 
  \fi\fi\fi\mbox{}}
\newcommand\dotend{\unskip\kern\dimexpr\wd\mydot-\replength\relax
  \\[-\arraystretch\dimexpr\ht\strutbox+\dp\strutbox\relax]}
\begin{document}
\begin{minipage}[t][1in][t]{3in}
    Hello world!\\
    \begin{tabular}[t]{@{}rll@{}}
            \noalign{\hrule height 0.5pt}
        a & some & text \\
          \tabdotline[r] &  \tabdotline &\tabdotline[l] \dotend
        b & some & other text \\
          \tabdotline[r] &  \tabdotline &\tabdotline[l] \dotend
        b & some more & text \\
          \tabdotline[r] &  \tabdotline &\tabdotline[l] \dotend
    \end{tabular}%
\end{minipage}
\end{document}

在此处输入图片描述

答案2

以下是你可以用{NiceTabular}of做的事情nicematrix。该环境类似于{tabular}(of array),但在数组的行、单元格和列下添加了 PGF/Tikz 节点。

可以使用该节点通过 Tikz 绘制虚线规则。

\documentclass[notitlepage,letterpaper]{article}
\usepackage{nicematrix}
\usepackage{tikz}

\begin{document}


\ExplSyntaxOn
\makeatletter
\NewDocumentCommand { \mydottedline } { }
  {
    \tl_gput_right:Nx \g_nicematrix_code_after_tl
      {
        \exp_not:N \tikz [dotted]
          \exp_not:N \draw (\int_use:N \c@iRow -| 1 ) 
                -- (\int_use:N \c@iRow -|\exp_not:N \int_eval:n { \c@jCol + 1 } ) ;
      }
  }
\makeatother
\ExplSyntaxOff  
  
\begin{minipage}[t][1in][t]{3in}
    Hello world!\\
    \begin{NiceTabular}[t]{@{}rll@{}}
        \noalign{\hrule height 0.5pt}
        a & some & text \\
            \mydottedline
        b & some & other text \\
            \mydottedline
        b & some more & text \\
            \mydottedline
    \end{NiceTabular}%
\end{minipage}

\end{document}

上述代码的输出

答案3

https://tex.stackexchange.com/a/332124/197451

这应该会给你指明正确的方向

在此处输入图片描述

\documentclass{article}

\newcommand\fillin[1][3cm]{\makebox[#1]{\dotfill}}
\begin{document} 
Why appropriate, specify? \fillin\\ 


Why inappropriate, specify? \fillin[4cm]\\ 


Why appropriate, specify? \dotfill\\


Why inappropriate, specify? \fillin[2cm]
\end{document}

相关内容