Wie kann ich den Wert einer expl3-Länge (Variablentyp dim) unter Verwendung einer Gleitkommazahl berechnen? Der folgende Code funktioniert nicht.

\documentclass{article}

\ExplSyntaxOn
\fp_new:N \l_abc_zahl_fp
\dim_new:N \l_abc_laenge_dim
\fp_set:Nn \l_abc_zahl_fp {3.25}
\dim_set:Nn \l_abc_laenge_dim { \l_abc_zahl_fp * 5mm }
\ExplSyntaxOff

\begin{document}
Die Zahl ist
\ExplSyntaxOn
\fp_to_decimal:N \l_abc_zahl_fp
\ExplSyntaxOff
. Die Länge ist
\ExplSyntaxOn
\dim_use:N \l_abc_laenge_dim
\ExplSyntaxOff
.
\end{document}

Fehlermeldung:

! Missing number, treated as zero.
<to be read again> 
                   \s__fp 
l.7 ... \l_abc_laenge_dim { \l_abc_zahl_fp * 5mm }

gefragt 13 Okt, 18:49

Cletus's gravatar image

Cletus
1.4k34661
Akzeptiert-Rate: 85%


Beispielweise so:

\documentclass{article}

\ExplSyntaxOn
\fp_new:N \l_abc_zahl_fp
\dim_new:N \l_abc_laenge_dim
\fp_set:Nn \l_abc_zahl_fp {3.25}
\dim_set:Nn \l_abc_laenge_dim { \fp_to_decimal:n { 5 * \l_abc_zahl_fp } mm }
\ExplSyntaxOff

\begin{document}
Die Zahl ist
\ExplSyntaxOn
\fp_to_decimal:N \l_abc_zahl_fp
\ExplSyntaxOff
. Die Länge ist
\ExplSyntaxOn
\dim_use:N \l_abc_laenge_dim
\ExplSyntaxOff
.

Das ist das \ExplSyntaxOn\fp_to_decimal:N \l_abc_zahl_fp-fache~\ExplSyntaxOff von
\ExplSyntaxOn 
\fp_to_dim:n { \fp_eval:n { \dim_to_decimal:n { \l_abc_laenge_dim } / \l_abc_zahl_fp } }.
\ExplSyntaxOff

\end{document}

Es gibt verschiedene Funktionen, um floating points bzw. decimals in dimensions und umgekehrt umzuwandeln. Was davon für dich am besten geeignet ist, hängt davon ab, was du in Wirklichkeit vor hast.

BTW: Verlässt man sich auf Interna von l3kernel (konkret l3fp), kann man die letzte l3-Zeile auch zu \fp_to_dim:n { \l_abc_laenge_dim / \l_abc_zahl_fp } verkürzen. Ich halte persönlich explizite Typumwandlungen jedoch für sauberer. Was man guten Gewissens machen kann, ist die Einsparung von \fp_eval:n in der Zeile, da dokumentiert ist, dass das Argument von \fp_to_dim eine floating point expression sein darf.

Permanenter link

beantwortet 13 Okt, 18:59

Ijon%20Tichy's gravatar image

Ijon Tichy
10.6k31532
Akzeptiert-Rate: 52%

bearbeitet 14 Okt, 07:51

Die dimension expressions von expl3 verwenden \dimexpr aus der e-TeX Erweiterung. Diese Primitive erlaubt zwar einige Rechenoperationen (Multiplikation mit einer Ganzzahl, Addition, Subtraktion, Division durch eine Ganzzahl und Klammern), aber die Syntax ist relativ restriktiv. Es wird zusammengefasst das erreicht, was mit \advance, \multiply und \divide möglich wäre.

Beispielsweise muss für die Multiplikation der erste Faktor eine gültige TeX-Länge sein, anschließend folgt ein * und eine Ganzzahl. Multiplikationen mit einer Gleitkommazahl sind nur mit Längenregistern oder geschachtelten \dimexpr möglich, also bspw. 0.8\linewidth.

Also \dim_set:Nn \l_tmpa_dim { 5mm * 3 } wäre möglich (wenn auch wenig nützlich). In normalem plain oder LaTeX würde ich \mydimen=\dimexpr 0.35\dimexpr 5mm\relax\relax verwenden, das entspricht aber nicht dem Stil von expl3.

Am komfortabelsten ist die Verwendung von l3fp, da es automatisch Längen nach pt konvertiert und das Ergebnis als Gleitkommazahl weiterverwendet. Eine Zuweisung einer Länge ist damit ganz einfach, man nutzt einfach \dim_set:Nn \l_tmpa_dim { \fp_eval { 3 * 5mm - 0.35 * 7cm + .2\linewidth } pt } und alles funktioniert wie erwartet und gewünscht (ist aber ein wenig langsamer als \dimexpr).

Also in Code eingebettet:

\documentclass{article}

\ExplSyntaxOn
\fp_new:N \l_abc_zahl_fp
\dim_new:N \l_abc_laenge_dim
\fp_set:Nn \l_abc_zahl_fp {3.25}
\dim_set:Nn \l_abc_laenge_dim { \fp_eval:n { \l_abc_zahl_fp * 5mm } pt }
\ExplSyntaxOff

\begin{document}
Die Zahl ist
\ExplSyntaxOn
\fp_to_decimal:N \l_abc_zahl_fp
\ExplSyntaxOff
. Die Länge ist
\ExplSyntaxOn
\dim_use:N \l_abc_laenge_dim
\ExplSyntaxOff
.
\end{document}
Permanenter link

beantwortet 13 Okt, 19:56

Skillmon's gravatar image

Skillmon
1.0k5
Akzeptiert-Rate: 52%

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×13
×10

gestellte Frage: 13 Okt, 18:49

Frage wurde gesehen: 134 Mal

zuletzt geändert: 14 Okt, 07:51