%20%D1%80%D0%B0%D0%B7%D1%80%D1%83%D1%88%D0%B0%D0%B5%D1%82%20%D0%BC%D0%B0%D0%BA%D0%B5%D1%82%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8.png)
Следующий пример кода показывает проблему с моей \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{..\\[..] ...}
я думаю, можно было бы использовать, но это тоже было бы своего рода хаком. Так что кодирование в том виде, в котором оно есть, вероятно, является самым простым способом достижения желаемых результатов (при условии, что вы знаете о побочных эффектах этих команд).