Anzeige:
Ergebnis 1 bis 7 von 7

Thema: sbox in Verbindung mit sinuitx: \metre in Box speichern scheitert

  1. #1
    Registrierter Benutzer Avatar von FloSch369
    Registriert seit
    07.03.2008
    Beiträge
    47

    sbox in Verbindung mit sinuitx: \metre in Box speichern scheitert

    Hallo,

    folgendes Minimalbeispiel
    Code:
    \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

  2. #2
    Registrierter Benutzer Avatar von bobmalaria
    Registriert seit
    28.11.2006
    Ort
    Düsseldorf
    Beiträge
    4.174
    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
    Mein Ball ist umgefallen

  3. #3
    Registrierter Benutzer
    Registriert seit
    09.12.2005
    Beiträge
    1.327
    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:
    Code:
    \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:
    Code:
    \documentclass{scrartcl}
    \usepackage{siunitx}
    \newcommand*{\boxname}{}
    \begin{document}
    \renewcommand*{\boxname}{\metre\per\second}
    
    \si{\metre\per\second}
    \si{\boxname}
    \end{document}

  4. #4
    Registrierter Benutzer
    Registriert seit
    19.05.2009
    Beiträge
    4.045
    Alternativ könnte für Deinen Ansatz ein Makro verwendet werden:
    Oder

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

  5. #5
    Registrierter Benutzer Avatar von FloSch369
    Registriert seit
    07.03.2008
    Beiträge
    47
    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
    Code:
    \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 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
    Code:
    \newcommand{\myline}[1]{\si{#1} \\}
    
    \begin{tabular}{l}
    \myline{\metre\per\second}
    \myline{\pascal}
    \end{tabular}

  6. #6
    Registrierter Benutzer
    Registriert seit
    19.05.2009
    Beiträge
    4.045
    Zitat Zitat von FloSch369 Beitrag anzeigen

    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.

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

  7. #7
    Registrierter Benutzer Avatar von FloSch369
    Registriert seit
    07.03.2008
    Beiträge
    47
    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.
    Geändert von FloSch369 (24-04-2013 um 15:17 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •