Я пытаюсь добавить пунктирную линию от левого края до правого края таблицы после строк. В моей лучшей попытке (код и снимок экрана ниже) есть 3 проблемы: 1) Длина пунктирной линии равна ширине мини-страницы, а не таблицы, 2) Точки не начинаются точно с левого края таблицы (есть небольшой зазор), 3) Уменьшение размера точек также изменяет начальную точку пунктирной линии, еще больше не совпадая с начальными точками линий с разными размерами точек (я хотел бы иметь линии с разными размерами точек, но все начинающиеся и заканчивающиеся на одном краю). Левый край самой левой точки должен касаться левого края таблицы (точно так же, как \hrule
в первой строке), а правый край самой правой точки должен касаться правого края таблицы. Я использую lualatex
.
ПРИМЕЧАНИЕ: Я наткнулся на хаки на Stack Exchange, которые используют тире вместо точек, я ищу точки, поэтому, пожалуйста, не публикуйте никаких ответов с тире. Кроме того, я не могу перейти в другую среду на данный момент, поэтому это должно быть решение для tabular
среды. Также, пожалуйста, не публикуйте tikz
или другие медленные трюки с рисованием. Если это не ясно из описания: я не собираюсь вручную указывать длину таблицы length, как n pt/cm/in
, решение сможет вычислить длину таблицы так же, как \hrule
я использую для первой строки. Наконец: учитывая акцент на тегах PDF и доступности в TUG 2020, решение в идеале не заставит утилиту преобразования текста в речь 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}