Warum zentriert center \halign nicht?

Warum zentriert center \halign nicht?

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 \halignzentriert auf der Seite angezeigt wird. Dies ist jedoch nicht der Fall, wie das Bild unten zeigt.

Bildbeschreibung hier eingeben

\centeringhat 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 \halignsich 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

Bildbeschreibung hier eingeben

Die vorübergehende Neudefinition \parsoll zeigen, dass \parsie 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 \halignwird Ihr Text bündig mit dem linken Rand gedruckt, da \tabskipnormalerweise Null ist. Der \tabskipbeim \halignScannen 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 \tabskipangegeben ist. Lesen Sie Kapitel 22 im TeXbook für weitere Informationen, aber es ist nicht einfach.

Wie kann man einen \halignTeil eines Absatzes bilden? Indem man ihn in etwas versteckt, das ihn enthalten kann und das ihn auch enthalten kann: \vboxNormalerweise 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 \vboxes 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 \halignwerden horizontale Boxen erstellt, die auf die umgebende vertikale Liste gesetzt werden, dort unempfindlich sind \leftskipund \rightskipvom 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 \hruleerstreckt es sich über die gesamte \hsizeBreite.

halign

Wir können das \halignin 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}
}}

Halign in einer Box

verwandte Informationen