Wie funktioniert dieses Makro für erweiterte Matrizen?

Wie funktioniert dieses Makro für erweiterte Matrizen?

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?

  1. \makeatletter: Das @Zeichen hat standardmäßig eine besondere Bedeutung und dieser Befehl entfernt diese besondere Bedeutung vorübergehend.
  2. \renewcommand*: Dies dient zum Neudefinieren eines vorhandenen Makros. Die mit einem Sternchen markierte Variante verhindert hier die versehentliche Einbeziehung mehrerer Absätze ( \n\noder \par), wenn das Makro verwendet wird.
  3. \env@matrix: Dies ist vermutlich der Befehl, den wir erneuern. Ist er irgendwo in definiert amsmath? Hat er wirklich ein @Symbol im Namen?
  4. [1]: Dies bedeutet, dass der neu erneuerte Befehl ein optionales Argument annimmt.
  5. [*\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. MaxMatrixColsist eine Variable, die in definiert ist amsmathund standardmäßig 10 ist, machen wir hier irgendwelche Berechnungen damit? Oder setzen wir sie zurück? Oder was? Vom Ende chabe ich auch keine Ahnung. Was ist eigentlich diese ganze Konstruktion? Ist es eine Art Mustervergleich für den optionalen Parameter?
  6. {%: Der geschickte Einsatz eines Kommentars besteht hier vermutlich darin, den Zeilenumbruch zu ignorieren. Ich sehe jedoch keinen Unterschied im Abstand ohne ihn.
  7. \hskip -\arraycolsep: Dies ist eine Rücktaste um den Betrag von\arraycolsep
  8. \let\@ifnextchar\new@ifnextchar: Dies überschattet den Befehl \@ifnextcharoder so etwas, aber warum? Keines \@ifnextcharvon beiden \new@ifnextcharscheint verwendet zu werden.
  9. \array{#1}}: Dies fügt ein Roharray ein und übergibt den Parameter. Ich bin nicht sicher, ob #1sich hier auf die optionale [ccc:c]Spezifikation oder den tatsächlichen Inhalt der Matrix bezieht.
  10. \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.

  1. \makeatletter: Wird @als Buchstabe verwendet und kann daher in einem Makronamen verwendet werden. SieheWas machen \makeatletter und \makeatother?
  2. Wie du weißt.
  3. Lesen Sie den dokumentierten Quellcode von amsmath, amsmath.pdf(erstellt durch Kompilieren von amsmath.dtx). Dies ist der Anfang einer Reihe von Matrixumgebungen ( matrix, bmatrix, pmatrix, usw.).
  4. Ein Argument. Es ist derzeit nicht bekannt, ob das Argument optional ist oder nicht.
  5. [...]nach [1](oder [2], [3]) bedeutet: Das erste Argument ist optional und gibt den Standardwert an.

    \c@MaxMatrixColsist dasselbe wie \value{MaxMatrixCols}, wobei MaxMatrixColsein in definierter Zähler ist amsmath(Standard: 10).

    * \c@MaxMatrixCols cals Argument von verwendet wird \array, ist es gleichbedeutend mit

    \begin{array}{*{10}{c}}
    
  6. Wie du weißt.
  7. Wie Sie wissen, wird der zusätzliche Platz durch die IE- Umgebung \arraycolseperzeugt . Ich würde stattdessen Folgendes verwenden, wenn ich es schreibe.\arrayarray\begin{@{}*{10}{c}@{}}
  8. \new@ifnextcharist definiert in amsgen.stygeladen durch amsmath. Lesen Sie diedokumentierter Quellcode.
  9. \arrayist der Anfang der arrayUmgebung. Beachten Sie, dass die einzelnen Matrixumgebungen schließlich aufrufen \endarray.
  10. Siehe oben.

verwandte Informationen