我正在尝试在行后从表格的左边缘到右边缘添加虚线。我的最佳尝试存在 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
为了更好地匹配左右边距,对改编版进行了另外两处编辑:
已将指定的边距与点联系起来。
最后需要右列字距减去一个
\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}