Mit folgendem Code:
\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}
Ich würde erwarten, dass die einfache Tabelle \halign
zentriert auf der Seite angezeigt wird. Dies ist jedoch nicht der Fall, wie das Bild unten zeigt.
\centering
hat auch keine Wirkung. Warum passiert das?
Antwort1
Man könnte versucht sein, Low-Level-Befehle auch in LaTeX zu verwenden. Diese enthalten jedoch einige Feinheiten, die am Anfang nicht leicht zu verstehen sind.
Eine dieser Feinheiten ist, dass es \halign
sich um einevertikaler Befehl, wenn es also gefunden wird, wird der vertikale Modus gestartet. Wenn sich TeX beim Scannen im horizontalen Modus befindet \halign
, wird dieser durch die Ausgabe beendet \par
.
Dies wird durch die folgende Testdatei (Plain TeX) bewiesen:
a\def\par{PAR\endgraf\let\par\endgraf}bc\halign{#\cr HALIGN\cr}def
\bye
das gibt aus
Die vorübergehende Neudefinition \par
soll zeigen, dass \par
sie wirksam umgesetzt wird.
Wenn TeX im vertikalen Modus ist, stapelt es einfach Boxen, ohne Absätze zu bilden; daher \centering
(was in der Tat der Fall ist center
) tut nichts, weil es nur Absätze beeinflusst. Daher \halign
wird Ihr Text bündig mit dem linken Rand gedruckt, da \tabskip
normalerweise Null ist. Der \tabskip
beim \halign
Scannen in Kraft befindliche Klebstoff wird links von jeder Box hinzugefügt, die durch \halign
(eine Box für jede Ausrichtungszeile) und zwischen zwei beliebigen Ausrichtungszellen gebildet wird, sofern nicht eine andere \tabskip
angegeben ist. Lesen Sie Kapitel 22 im TeXbook für weitere Informationen, aber es ist nicht einfach.
Wie kann man einen \halign
Teil eines Absatzes bilden? Indem man ihn in etwas versteckt, das ihn enthalten kann und das ihn auch enthalten kann: \vbox
Normalerweise wird ein verwendet (das gebräuchlichste Mittel zum Zentrieren von Tabellen in Plain TeX ist die Verwendung von $$\vbox{\halign{...}}$$
; versuchen Sie es nicht in LaTeX). Obwohl \vbox
es nicht von sich aus einen Absatz beginnt, unterbricht es ihn auch nicht, also
\begin{center}
\leavevmode\vbox{\halign{...}}
\end{center}
zentriert Ihre Ausrichtung.
Verwenden Sie tabular
; dann sind Sie auf der sicheren Seite.
Antwort2
Es \halign
werden horizontale Boxen erstellt, die auf die umgebende vertikale Liste gesetzt werden, dort unempfindlich sind \leftskip
und \rightskip
vom Absatzgenerator befolgt werden.
Sie können versuchen, die Zentrierung folgendermaßen vorzunehmen:
\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}
Allerdings \hrule
erstreckt es sich über die gesamte \hsize
Breite.
Wir können das \halign
in ein einfügen \vbox
.
\bigskip
\centering
\noindent\vbox{\halign{\vrule \hfil # \hfil & \hfil # \hfil \vrule \cr
a & b \cr\noalign{\hrule}
c & d \cr\noalign{\hrule}
}}