Überarbeitungsverlauf[Zurück]
Klicke auf Einblenden/Ausblenden von Überarbeitungen 10
Erklärung zum \parskip-Beispiel verschoben, Erklärung zu calc erweitert

25 Apr '18, 08:22

gast3's gravatar image

gast3
(ausgesetzt)

Die Angabe eines Faktors zu einem Längenregister ist immer möglich: \newlength{\laenge} \setlength{\laenge}{2mm} \setlength{\parindent}{2\laenge} Dabei ist `\laenge` quasi die Maßeinheit und `2` der Wert in dieser Maßeinheit. Bei Befehlen ist dies im Gegensatz zu Registern nicht möglich. Sowohl `pdflatex`, `lualatex` und `xelatex` beinhalten aber außerdem auch die e-TeX-Erweiterungen. Bei den gängigen, freien TeX-Distributionen MiKTeX und TeX Live gilt das auch für `latex`. Damit sind Ausdrücke mit Hilfe von `\dimexpr` oder `\glueexpr` möglich: \documentclass[12pt]{article} \newcommand{\laenge}{2mm} \begin{document} \setlength{\parskip}{\glueexpr \laenge * 2 + 10pt plus 1pt minus 1pt\relax} Der Absatzabstand ist nun: \the\parskip \end{document} [![Der Absatzabstand ist nun: 21.38107pt plus 1.0pt minus 1.0pt][1]][2] Natürlich kann man `\glueexpr`, `\dimexpr` und `\numexpr` nicht nur innerhalb von `\setlength` verwenden. Sie sind überall dort einsetzbar, wie man auch *skips*, *dimens* oder *counter* oder deren Werte verwenden kann, also beispielsweise auch: \documentclass[12pt]{scrbook} \newcommand{\laenge}{2mm} \RedeclareSectionCommand[tocnumwidth=\dimexpr\laenge+30mm\relax]{chapter} % Addition mit 30 mm \begin{document} \tableofcontents \chapter{Test} \end{document} [![Der Inhaltsverzeichniseintrag mit großem Abstand zwischen Nummer und Text.][3]][3] wobei hier als Besonderheit hinzu kommt, dass der Optionenparser von KOMA-Script für `tocnumwidth` (bzw. `numwidth` in `\DeclareTOCStyleEntry`) explizit auch Ausdrücke erlaubt. Näheres zu `\numexpr`, `\dimexpr` und `\glueexpr` ist dem [e-TeX-Manual](http://mirrors.ctan.org/systems/doc/etex/etex_man.pdf) zu entnehmen (bitte unbedingt nachlesen!!!). Ersetzt man im `\parskip`-Beispiel in diesem Beispiel `\parskip` durch `\parindent` erhält man übrigens als Ergebnis nur den Wert 21.38107pt ohne Leim (*glue*). Das liegt daran, dass `\parindent` nur ein (spezielles) Längenregister (*dimen*) ist, während `\parskip` eine dehn- und schrumpfbare Länge (*skip*) ist. Zu diesem Unterschied und dem zwischen Registern und Befehlen sei auf ausführliche LaTeX-Einführungen, [TeX by Topic](http://mirrors.ctan.org/info/texbytopic/TeXbyTopic.pdf) und [The TeXbook](https://www.lehmanns.de/shop/mathematik-informatik/172175-9780201134483-the-texbook) verwiesen. Natürlich kann man `\glueexpr`, `\dimexpr` und `\numexpr` nicht nur innerhalb von `\setlength` verwenden. Sie sind überall dort einsetzbar, wie man auch *skips*, *dimens* oder *counter* oder deren Werte verwenden kann, also beispielsweise auch: \documentclass[12pt]{scrbook} \newcommand{\laenge}{2mm} \RedeclareSectionCommand[tocnumwidth=\dimexpr\laenge+30mm\relax]{chapter} % Addition mit 30 mm \begin{document} \tableofcontents \chapter{Test} \end{document} [![Der Inhaltsverzeichniseintrag mit großem Abstand zwischen Nummer und Text.][3]][3] wobei hier als Besonderheit hinzu kommt, dass der Optionenparser von KOMA-Script für `tocnumwidth` (bzw. `numwidth` in `\DeclareTOCStyleEntry`) explizit auch Ausdrücke erlaubt. Näheres zu `\numexpr`, `\dimexpr` und `\glueexpr` ist dem [e-TeX-Manual](http://mirrors.ctan.org/systems/doc/etex/etex_man.pdf) zu entnehmen (bitte unbedingt nachlesen!!!). Bei Verwendung von `\dimexpr` innerhalb von `\newcommand` muss man beachten, dass dies wie Makros oder Längen auch, erst zum Zeitpunkt der Verwendung ausgewertet wird. Dagegen wird der Ausdruck bei Verwendung in `\setlength` unmittelbar ausgewertet. Das ist ein genereller Unterschied zwischen `\newcommand` (und Makros) zu `\setlength` (und Längenregistern) und hat nichts mit `\dimexpr` selbst zu tun. Nur zur Vollständigkeit sei auch noch auf das Paket [`calc`](https://ctan.org/pkg/calc) hingewiesen, das diverse LaTeX-Befehle wie `\setlength`, `\addtolength` aber auch `\rule`, `\makebox`, `\parbox` etc. so erweitert, dass Berechnungen in den Längenargumenten möglich sind: \documentclass[12pt]{article} \usepackage{calc} \newcommand{\laenge}{2mm} \begin{document} \setlength{\parskip}{\laenge * 2 + 10pt plus 1pt minus 1pt} Der Absatzabstand ist nun: \the\parskip \end{document} Allerdings findet dabei die Zerlegung der Ausdrücke in TeX statt, was wesentlich langsamer ist als die Verarbeitung mit den e-TeX-Primitiven `\dimexpr`, `\glueexpr` und `\numexpr`. `\numexpr`. Außerdem verändert das Paket nur die Befehle, die es kennt und hat beispielsweise keinen Einfluss darauf, was KOMA-Script als Wert für eine Option erlaubt. Darüber hinaus gibt es Berechnungsmöglichkeiten auch in [LaTeX3](https://ctan.org/pkg/l3kernel). So bietet beispielsweise `l3skip` mit `\dim_eval:n` die Möglichkeit, Ausdrücke zu berechnen. Damit verlassen wir dann aber die *normale* LaTeX-Syntax. `expl3` beschreibt eher die Implementierungsebene für neue Benutzeranweisungen (also das, was Paketautoren verwenden können oder sollten) und ist weniger dazu gedacht, vom Benutzer direkt verwendet zu werden. [1]: https://texwelt.de/wissen/upfiles/test_20180424_102208.png [2]: https://texwelt.de/wissen/upfiles/test_20180424_102208.png [3]: https://texwelt.de/wissen/upfiles/test_20180425_075153.png
Klicke auf Einblenden/Ausblenden von Überarbeitungen 9
Bild hinzugefügt

25 Apr '18, 08:15

gast3's gravatar image

gast3
(ausgesetzt)

Die Angabe eines Faktors zu einem Längenregister ist immer möglich: \newlength{\laenge} \setlength{\laenge}{2mm} \setlength{\parindent}{2\laenge} Dabei ist `\laenge` quasi die Maßeinheit und `2` der Wert in dieser Maßeinheit. Bei Befehlen ist dies im Gegensatz zu Registern nicht möglich. Sowohl `pdflatex`, `lualatex` und `xelatex` beinhalten aber außerdem auch die e-TeX-Erweiterungen. Bei den gängigen, freien TeX-Distributionen MiKTeX und TeX Live gilt das auch für `latex`. Damit sind Ausdrücke mit Hilfe von `\dimexpr` oder `\glueexpr` möglich: \documentclass[12pt]{article} \newcommand{\laenge}{2mm} \begin{document} \setlength{\parskip}{\glueexpr \laenge * 2 + 10pt plus 1pt minus 1pt\relax} Der Absatzabstand ist nun: \the\parskip \end{document} [![Der Absatzabstand ist nun: 21.38107pt plus 1.0pt minus 1.0pt][1]][1] 1.0pt][1]][2] Natürlich kann man `\glueexpr`, `\dimexpr` und `\numexpr` nicht nur innerhalb von `\setlength` verwenden. Sie sind überall dort einsetzbar, wie man auch *skips*, *dimens* oder *counter* oder deren Werte verwenden kann, also beispielsweise auch: \documentclass[12pt]{scrbook} \newcommand{\laenge}{2mm} \RedeclareSectionCommand[tocnumwidth=\dimexpr\laenge+30mm\relax]{chapter} % Addition mit 30 mm \begin{document} \tableofcontents \chapter{Test} \end{document} [![Der Inhaltsverzeichniseintrag mit großem Abstand zwischen Nummer und Text.][3]][3] wobei hier als Besonderheit hinzu kommt, dass der Optionenparser von KOMA-Script für `tocnumwidth` (bzw. `numwidth` in `\DeclareTOCStyleEntry`) explizit auch Ausdrücke erlaubt. Näheres zu `\numexpr`, `\dimexpr` und `\glueexpr` ist dem [e-TeX-Manual](http://mirrors.ctan.org/systems/doc/etex/etex_man.pdf) zu entnehmen. entnehmen (bitte unbedingt nachlesen!!!). Ersetzt man im `\parskip`-Beispiel `\parskip` durch `\parindent` erhält man übrigens als Ergebnis nur den Wert 21.38107pt ohne Leim (*glue*). Das liegt daran, dass `\parindent` nur ein (spezielles) Längenregister (*dimen*) ist, während `\parskip` eine dehn- und schrumpfbare Länge (*skip*) ist. Zu diesem Unterschied und dem zwischen Registern und Befehlen sei auf ausführliche LaTeX-Einführungen, [TeX by Topic](http://mirrors.ctan.org/info/texbytopic/TeXbyTopic.pdf) und [The TeXbook](https://www.lehmanns.de/shop/mathematik-informatik/172175-9780201134483-the-texbook) verwiesen. Bei Verwendung von `\dimexpr` innerhalb von `\newcommand` muss man beachten, dass dies wie Makros oder Längen auch, erst zum Zeitpunkt der Verwendung ausgewertet wird. Dagegen wird der Ausdruck bei Verwendung in `\setlength` unmittelbar ausgewertet. Das ist ein genereller Unterschied zwischen `\newcommand` (und Makros) zu `\setlength` (und Längenregistern) und nichts mit `\dimexpr` selbst zu tun. Nur zur Vollständigkeit sei auch noch auf das Paket [`calc`](https://ctan.org/pkg/calc) hingewiesen, das diverse LaTeX-Befehle wie `\setlength`, `\addtolength` aber auch `\rule`, `\makebox`, `\parbox` etc. so erweitert, dass Berechnungen in den Längenargumenten möglich sind: \documentclass[12pt]{article} \usepackage{calc} \newcommand{\laenge}{2mm} \begin{document} \setlength{\parskip}{\laenge * 2 + 10pt plus 1pt minus 1pt} Der Absatzabstand ist nun: \the\parskip \end{document} Allerdings findet dabei die Zerlegung der Ausdrücke in TeX statt, was wesentlich langsamer ist als die Verarbeitung mit den e-TeX-Primitiven `\dimexpr`, `\glueexpr` und `\numexpr`. Darüber hinaus gibt es Berechnungsmöglichkeiten auch in [LaTeX3](https://ctan.org/pkg/l3kernel). So bietet beispielsweise `l3skip` mit `\dim_eval:n` die Möglichkeit, Ausdrücke zu berechnen. Damit verlassen wir dann aber die *normale* LaTeX-Syntax. `expl3` beschreibt eher die Implementierungsebene für neue Benutzeranweisungen (also das, was Paketautoren verwenden können oder sollten) und ist weniger dazu gedacht, vom Benutzer direkt verwendet zu werden. [1]: https://texwelt.de/wissen/upfiles/test_20180424_102208.pnghttps://texwelt.de/wissen/upfiles/test_20180424_102208.png [2]: https://texwelt.de/wissen/upfiles/test_20180424_102208.png [3]: https://texwelt.de/wissen/upfiles/test_20180425_075153.png
Klicke auf Einblenden/Ausblenden von Überarbeitungen 8
zusätzliche Erklärung für lesefaule Anfänger

25 Apr '18, 08:10

gast3's gravatar image

gast3
(ausgesetzt)

Klicke auf Einblenden/Ausblenden von Überarbeitungen 7
calc und l3skip hinzugefügt

24 Apr '18, 11:31

gast3's gravatar image

gast3
(ausgesetzt)

Klicke auf Einblenden/Ausblenden von Überarbeitungen 6

24 Apr '18, 10:48

gast3's gravatar image

gast3
(ausgesetzt)

Klicke auf Einblenden/Ausblenden von Überarbeitungen 5
Unterschied zwischen dimen und skip angeschnitten

24 Apr '18, 10:46

gast3's gravatar image

gast3
(ausgesetzt)

Klicke auf Einblenden/Ausblenden von Überarbeitungen 4
Echtes Minimalbeispiel

24 Apr '18, 10:43

gast3's gravatar image

gast3
(ausgesetzt)

Klicke auf Einblenden/Ausblenden von Überarbeitungen 3

24 Apr '18, 10:37

gast3's gravatar image

gast3
(ausgesetzt)

Klicke auf Einblenden/Ausblenden von Überarbeitungen 2

24 Apr '18, 10:33

gast3's gravatar image

gast3
(ausgesetzt)

Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

24 Apr '18, 10:29

gast3's gravatar image

gast3
(ausgesetzt)

Willkommen, erstes Mal hier? Schau mal unter FAQ!

×