
Ich habe diesen Code, den ich irgendwo gefunden habe, verwendet, um buchstäblich Hunderte von erweiterten Matrizen zu setzen, und es war erstaunlich:
\documentclass[a4paper,12pt]{article}
\usepackage{amsmath}
\usepackage{arydshln}
\makeatletter
\renewcommand*\env@matrix[1][*\c@MaxMatrixCols c]{%
\hskip -\arraycolsep
\let\@ifnextchar\new@ifnextchar
\array{#1}}
\makeatother
\begin{document}
\(\begin{bmatrix}[ccc:c]
1&2&3&0 \\
4&5&6&0 \\
7&8&9&0 \\
\end{bmatrix}\)
\end{document}
Meine TeX- und LaTeX-Kenntnisse sind, ähm, noch recht rudimentär. Aber ich gebe mein Bestes, um sie zu erlernen.
Ich habe jedoch Probleme herauszufinden, wie der neu definierte Matrixbefehl wie oben genau funktioniert. Hier ist meine beste Vermutung. Können Sie mich korrigieren und/oder die Lücken füllen?
\makeatletter
: Das@
Zeichen hat standardmäßig eine besondere Bedeutung und dieser Befehl entfernt diese besondere Bedeutung vorübergehend.\renewcommand*
: Dies dient zum Neudefinieren eines vorhandenen Makros. Die mit einem Sternchen markierte Variante verhindert hier die versehentliche Einbeziehung mehrerer Absätze (\n\n
oder\par
), wenn das Makro verwendet wird.\env@matrix
: Dies ist vermutlich der Befehl, den wir erneuern. Ist er irgendwo in definiertamsmath
? Hat er wirklich ein@
Symbol im Namen?[1]
: Dies bedeutet, dass der neu erneuerte Befehl ein optionales Argument annimmt.[*\c@MaxMatrixCols c]
: Ich weiß nicht, was das*
am Anfang davon bewirkt.\c
(soweit ich weiß) ist für Cedillen gedacht, aber das scheint hier nicht zu passen.MaxMatrixCols
ist eine Variable, die in definiert istamsmath
und standardmäßig 10 ist, machen wir hier irgendwelche Berechnungen damit? Oder setzen wir sie zurück? Oder was? Vom Endec
habe ich auch keine Ahnung. Was ist eigentlich diese ganze Konstruktion? Ist es eine Art Mustervergleich für den optionalen Parameter?{%
: Der geschickte Einsatz eines Kommentars besteht hier vermutlich darin, den Zeilenumbruch zu ignorieren. Ich sehe jedoch keinen Unterschied im Abstand ohne ihn.\hskip -\arraycolsep
: Dies ist eine Rücktaste um den Betrag von\arraycolsep
\let\@ifnextchar\new@ifnextchar
: Dies überschattet den Befehl\@ifnextchar
oder so etwas, aber warum? Keines\@ifnextchar
von beiden\new@ifnextchar
scheint verwendet zu werden.\array{#1}}
: Dies fügt ein Roharray ein und übergibt den Parameter. Ich bin nicht sicher, ob#1
sich hier auf die optionale[ccc:c]
Spezifikation oder den tatsächlichen Inhalt der Matrix bezieht.\makeatother
: Dadurch wird das@
Symbol vermutlich in seinen Normalzustand zurückversetzt.
Antwort1
Wenn Sie mit der Verwendung von noch nicht vertraut sind \renewcommand
, müssen Sie möglicherweise mehr lernen, um den Code zu verstehen.
\makeatletter
: Wird@
als Buchstabe verwendet und kann daher in einem Makronamen verwendet werden. SieheWas machen \makeatletter und \makeatother?- Wie du weißt.
- Lesen Sie den dokumentierten Quellcode von
amsmath
,amsmath.pdf
(erstellt durch Kompilieren vonamsmath.dtx
). Dies ist der Anfang einer Reihe von Matrixumgebungen (matrix
,bmatrix
,pmatrix
, usw.). - Ein Argument. Es ist derzeit nicht bekannt, ob das Argument optional ist oder nicht.
[...]
nach[1]
(oder[2]
,[3]
) bedeutet: Das erste Argument ist optional und gibt den Standardwert an.\c@MaxMatrixCols
ist dasselbe wie\value{MaxMatrixCols}
, wobeiMaxMatrixCols
ein in definierter Zähler istamsmath
(Standard: 10).* \c@MaxMatrixCols c
als Argument von verwendet wird\array
, ist es gleichbedeutend mit\begin{array}{*{10}{c}}
- Wie du weißt.
- Wie Sie wissen, wird der zusätzliche Platz durch die IE- Umgebung
\arraycolsep
erzeugt . Ich würde stattdessen Folgendes verwenden, wenn ich es schreibe.\array
array
\begin{@{}*{10}{c}@{}}
\new@ifnextchar
ist definiert inamsgen.sty
geladen durchamsmath
. Lesen Sie diedokumentierter Quellcode.\array
ist der Anfang derarray
Umgebung. Beachten Sie, dass die einzelnen Matrixumgebungen schließlich aufrufen\endarray
.- Siehe oben.