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

Code, hier editierbar zum Übersetzen:
\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}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Fehlermeldung:

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

gefragt 13 Okt '21, 18:49

Cletus's gravatar image

Cletus
1.6k75867
Akzeptiert-Rate: 75%


Beispielweise so:

Code, hier editierbar zum Übersetzen:
\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}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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 '21, 18:59

gast3's gravatar image

gast3
(ausgesetzt)
Akzeptiert-Rate: 53%

bearbeitet 14 Okt '21, 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:

Code, hier editierbar zum Übersetzen:
\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}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Permanenter link

beantwortet 13 Okt '21, 19:56

Skillmon's gravatar image

Skillmon
1.2k6
Akzeptiert-Rate: 46%

Deine Antwort
[Vorschau ausblenden]

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

Frage-Themen:

×13
×10

gestellte Frage: 13 Okt '21, 18:49

Frage wurde gesehen: 3,463 Mal

zuletzt geändert: 14 Okt '21, 07:51

Willkommen, erstes Mal hier? Schau mal unter FAQ!

×