\hbox в столбце "p" (табличном) разрушает макет строки

\hbox в столбце "p" (табличном) разрушает макет строки

Следующий пример кода показывает проблему с моей \vertgapкомандой, которая просто предназначена для добавления некоторого пространства над и под обязательным аргументом после его инкапсуляции в \hbox(для высокого содержимого). Он отлично работает в lстолбцах -type, но, очевидно, не в pстолбцах -type. При первой попытке я не распознал этого, потому что он работает в longtable(примечание: в примере кода отсутствуют заголовки и подстрочные строки), не игнорируя также автоматически вставленный \centering.

Моя цель видна в longtable: все три строки таблицы имеют одинаковую высоту. Возможно ли добиться такого поведения tabularи в ?

Дополнение: простого использования \hboxв pстолбце типа достаточно, чтобы выявить проблему.

\documentclass{article}
\usepackage{longtable}
\usepackage{array}

\newcommand{\vertgap}[1]{\hbox{\vbox{\kern0.25ex\vtop{\hbox{#1}\kern0.25ex}}}}%
%\newcommand{\vertgap}[1]{\hbox{\vbox{\hrule height0.25ex\vtop{\hbox{#1}\hrule height0.25ex}}}}%
% The commented-out command above shows the inserted gaps - these seem to be ok.

\begin{document}

\begin{tabular}{|l|>{\centering}p{2in}|l|}
\hline%
aaaa: & 4711-0815 & any\\
\hline%
aaa: & \vertgap{0815} & any\\
\hline%
aa: & 4711 & any\\
\hline%
\end{tabular}

\begin{longtable}{|l|>{\centering}p{2in}|l|}
\hline%
aaaa: & 4711-0815 & any\\
\hline%
aaa: & \vertgap{0815} & any\\
\hline%
aa: & 4711 & any\\
\hline%
\end{longtable}

\end{document}

решение1

\hboxявляется примитивом TeX и не должен использоваться в LaTeX, если вы не знаете, как он работает в деталях (вы можете столкнуться с проблемами, связанными с цветами или размещением --- как вы и сделали). Соответствующая команда LaTeX для использования — это \mboxи это исправит вашу проблему.

Основная причина в том, что \hboxне начинает абзац, если встречается в вертикальном режиме, он просто добавляется с выравниванием по левому краю. Поэтому \centeringне имеет никакого эффекта. \mboxгарантирует, что блок станет частью абзаца.

Обновлять

Может быть, мне следует добавить, что то же самое относится и к \kern, \vbox, \vtop, т. е. они не поддерживаются командами LaTeX "уровня документа". Все они, конечно, команды, необходимые для сборки пакетов и т. д., но на уровне пользователя их желательно избегать.

Сказав это, на самом деле нет эквивалента LaTeX, так \vtop{\kern...\hbox{#1}\kern...}как это создает вертикальный блок, который имеет такую ​​же ширину, как и hbox внутри. LaTeX предлагает только вертикальные блоки, которые имеют определенную ширину, например, \parboxи в тот момент, когда вы начинаете абзац внутри определенной ширины, ширина будет равна ширине блока независимо от содержимого. Ну, \shortstack{..\\[..] ...}я думаю, можно было бы использовать, но это тоже было бы своего рода хаком. Так что кодирование в том виде, в котором оно есть, вероятно, является самым простым способом достижения желаемых результатов (при условии, что вы знаете о побочных эффектах этих команд).

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