С помощью следующего кода:
\documentclass[a4paper]{report}
\begin{document}
\begin{center}
\halign{\vrule \hfil # \hfil & \hfil # \hfil \vrule \cr
a & b \cr\noalign{\hrule}
c & d \cr\noalign{\hrule}
}
\end{center}
\end{document}
Я ожидал бы получить простую таблицу, выровненную по \halign
центру страницы. Однако, это не так, как показано на рисунке ниже.
\centering
тоже не имеет никакого эффекта. Почему так происходит?
решение1
Может возникнуть соблазн использовать низкоуровневые команды и в LaTeX; однако в них есть некоторые тонкости, которые нелегко понять с самого начала.
Одна из этих тонкостей заключается в том, что \halign
этовертикальная команда, поэтому при его обнаружении запускается вертикальный режим; если TeX находится в горизонтальном режиме при сканировании \halign
, он выходит из него, выдавая \par
.
Это подтверждается следующим тестовым файлом (Plain TeX):
a\def\par{PAR\endgraf\let\par\endgraf}bc\halign{#\cr HALIGN\cr}def
\bye
что выводит
Временное переопределение \par
направлено на то, чтобы показать, что \par
оно эффективно выполняется.
Когда TeX находится в вертикальном режиме, он просто складывает блоки, не создавая абзацев; поэтому \centering
(что в действительности происходит в center
) ничего не делает, поскольку влияет только на абзацы. Таким образом, ваш \halign
будет напечатан вровень с левым полем, поскольку \tabskip
обычно равен нулю. \tabskip
Действующий в данный момент клей \halign
сканируется и добавляется слева от каждого блока, образованного \halign
(один блок для каждой строки выравнивания) и между любыми двумя ячейками выравнивания, если не \tabskip
указано иное. Прочитайте главу 22 в TeXbook для получения дополнительной информации, но это нелегко.
Как можно сделать \halign
часть абзаца? Спрятав его внутри чего-то, что может и что также может его содержать: \vbox
обычно используется a (наиболее распространенный способ центрирования таблиц в Plain TeX — использовать $$\vbox{\halign{...}}$$
; не пытайтесь делать это в LaTeX). Хотя \vbox
сам по себе он не начинает абзац, он также не прерывает его, так что
\begin{center}
\leavevmode\vbox{\halign{...}}
\end{center}
отцентрирует ваше выравнивание.
Используйте tabular
; вы будете в безопасности.
решение2
Строит \halign
горизонтальные блоки, которые помещаются в окружающий вертикальный список, они нечувствительны к \leftskip
и \rightskip
подчиняются конструктору абзацев.
Вы можете попробовать выполнить центрирование, используя это:
\documentclass{article}
\begin{document}
\halign{\vrule \hfil # \hfil & \hfil # \hfil \vrule \cr
a & b \cr\noalign{\hrule}
c & d \cr\noalign{\hrule}
}
\tabskip 0pt plus 1000pt minus 1000pt
\halign to \hsize{\tabskip0pt\vrule \hfil # \hfil & \hfil # \hfil \vrule
\tabskip 0pt plus 1000pt minus 1000pt \cr
a & b \cr\noalign{\hrule}
c & d \cr\noalign{\hrule}
}
\end{document}
Однако он \hrule
простирается на всю \hsize
ширину.
Мы можем поместить \halign
в \vbox
.
\bigskip
\centering
\noindent\vbox{\halign{\vrule \hfil # \hfil & \hfil # \hfil \vrule \cr
a & b \cr\noalign{\hrule}
c & d \cr\noalign{\hrule}
}}