Почему center не center \halign?

Почему center не center \halign?

С помощью следующего кода:

\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

Мы можем поместить \halignв \vbox.

\bigskip

\centering
\noindent\vbox{\halign{\vrule \hfil # \hfil & \hfil # \hfil \vrule \cr
a & b \cr\noalign{\hrule}
c & d \cr\noalign{\hrule}
}}

halign в коробке

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