Табличная пунктирная линия от края до края: подавление переполнения, уменьшение размера точек, выравнивание точек по краям

Табличная пунктирная линия от края до края: подавление переполнения, уменьшение размера точек, выравнивание точек по краям

Я пытаюсь добавить пунктирную линию от левого края до правого края таблицы после строк. В моей лучшей попытке (код и снимок экрана ниже) есть 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.

Для лучшего соответствия левого и правого полей в адаптацию были внесены два дополнительных ПРАВКИ:

  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}

Связанный контент