PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : sbox in Verbindung mit sinuitx: \metre in Box speichern scheitert



FloSch369
24-04-2013, 12:49
Hallo,

folgendes Minimalbeispiel

\documentclass{scrartcl}
\usepackage{siunitx}
\begin{document}
\newsavebox{\boxname}
\sbox{\boxname}{\metre\per\second}

\si{\metre\per\second}
\si{\usebox{\boxname}}
\end{document}
funktioniert nicht. Zeile 7 alleine klappt, für Zeile 5 kommt, dass \metre, \per und \second undefiniert sind. Ich nehme an, dass der in einer Box zu speichernde Inhalt vor dem Speichern erst expandiert wird und daran wird es wohl scheitern. Gibt es eine Möglichkeit "\metre" ohne Umwandlung in der Box zu speichern, so dass obiges Beispiel funktioniert? Vielen Dank

Grüße

Florian

bobmalaria
24-04-2013, 13:09
hi,

bevor wir uns verrenken. kannst du erklaeren warum du units in boxen abspeichern willst?

ich frage nur weil du vielleicht etwas versuchst das man mit einem anderen ansatz einfacher loesen kann.

gruss

klops
24-04-2013, 13:23
Wie der Anleitung zu siunitx zu entnehmen ist, sind \metre etc. nur innerhalb von \si definiert. Beim Speichern einer Box wird im expandiert. Das muss auch so sein, weil der Inhalt bereits zu diesem Zeitpunkt die Ausmaße der Box bestimmt. Ein unexpandierter Inhalt hätte unbekannte Ausmaße. Ein box-Register hat aber immer bekannte Ausmaße (können mit \ht, \dp und \wd abgefragt werden).

Daher müssen dort \metre etc. bereits in \si verwendet werden:
\documentclass{scrartcl}
\usepackage{siunitx}
\begin{document}
\newsavebox{\boxname}
\sbox\boxname{\si{\metre\per\second}}

\si{\metre\per\second}
\usebox{\boxname}
\end{document}


Allgemein ist ein box-Register mit einer Seite oder auch nur mit einer fertigen Zeile einer Seite vergleichbar (je nachdem, ob es eine vertikale oder wie in diesem Fall eine horizontale Box ist). Für den Inhalt der Seite wird übrigens auch nur ein (spezielle) box-Register verwendet.

Alternativ könnte für Deinen Ansatz ein Makro verwendet werden:
\documentclass{scrartcl}
\usepackage{siunitx}
\newcommand*{\boxname}{}
\begin{document}
\renewcommand*{\boxname}{\metre\per\second}

\si{\metre\per\second}
\si{\boxname}
\end{document}

u_fischer
24-04-2013, 14:40
Alternativ könnte für Deinen Ansatz ein Makro verwendet werden:

Oder


\documentclass{scrartcl}
\usepackage{siunitx}
\DeclareSIUnit\mpersec{\metre\per\second}
\begin{document}
\si{\metre\per\second}
\si{\mpersec}
\end{document}

FloSch369
24-04-2013, 14:57
Vielen Dank für alle Antworten. Dann ist es so, wie ich vermutet hatte, dass der Inhalt vor dem Speichern umgewandelt wird. Macht Sinn.

Zum Hintergrund: ich wollte per

\begin{tabular}{>{\si\bgroup}p{1cm}<{\egroup}}
\metre\per\second \\
\pascal\\
...
\end{tabular}
in einer Tabelle eine Spalte fester Breite haben, in der ich Einheiten per siunitx setzen kann, ohne jedes Mal \si{...} schreiben zu müssen. Natürlich besteht die Tabelle aus mehr Spalten als nur diese eine. In der Doku zu siunitx sind die Spaltendefinitionen "s" und "S" beschrieben. Für mich zutreffend wäre "s". Allerdings habe ich nicht gesehen, dass man deren Breite und Ausrichtung festlegen kann.

>{} und <{} funktioniert für \si nicht (Missing } inserted). Deshalb der Versuch, wie hier (http://en.wikibooks.org/wiki/LaTeX/Tables#Column_specification_using_.3E.7B.5Ccmd.7D_ and_.3C.7B.5Ccmd.7D) beschrieben mit den Boxen. Da aber z. B. \metre vor dem Speichern umgewandelt wird, ist es Essig.

Sofern es keine elegantere Lösung gibt, mache ich es wie bisher per

\newcommand{\myline}[1]{\si{#1} \\}

\begin{tabular}{l}
\myline{\metre\per\second}
\myline{\pascal}
\end{tabular}

u_fischer
24-04-2013, 15:29
in einer Tabelle eine Spalte fester Breite haben, in der ich Einheiten per siunitx setzen kann, ohne jedes Mal \si{...} schreiben zu müssen. Natürlich besteht die Tabelle aus mehr Spalten als nur diese eine. In der Doku zu siunitx sind die Spaltendefinitionen "s" und "S" beschrieben. Für mich zutreffend wäre "s". Allerdings habe ich nicht gesehen, dass man deren Breite und Ausrichtung festlegen kann.


Siehe Table 25: Options for tabular material und folgende Seiten.


\begin{tabular}{s[table-column-width=1cm]l}
\metre\per\second &abc \\
\pascal &abc\\
\end{tabular}
\end{document}

FloSch369
24-04-2013, 16:03
U made my day! Tausend Dank.

Offensichtlich habe ich in der Doku zu oberflächlich nachgesehen, sonst hätte ich die Lösung sehen müssen. Entschuldigung dafür.

Wenigstens hat mich das zu >{} und <{} und das mit den Boxen in Tabellen geführt. So habe ich wenigstens doch noch etwas gelernt.

Edit: kann man im Board Themen nicht auf "gelöst" setzen? Habe diese Option vergeblich gesucht. Auch den Titel kann ich nicht nachträglich editieren und bspw. "[gelöst]" hinzufügen.