Gesucht wird ein Befehl, der mit Hilfe von expl3 alle Leerzeichen durch einen Schrägstrich ersetzt (vgl. Antwort von Clemens auf diese Frage) und außerdem alle Klein- durch Großbuchstaben ersetzt. Expl3 bietet den Befehl \tl_to_uppercase an, jedoch ist es mir nicht gelungen, diesen praktisch anzuwenden.

Open in Online-Editor
\documentclass{article}
\usepackage[utf8]{inputenc}

\usepackage{expl3,xparse}
\ExplSyntaxOn
\cs_new_protected:Npn \cletus_replace:n #1
  {
    \tl_set:Nn \l_tmpa_tl {#1}
    \tl_replace_all:Nnn \l_tmpa_tl {ß} {ss}
    \tl_replace_all:Nnn \l_tmpa_tl {~} {/\linebreak[0]}
    % Hier muss jetzt jeder Klein- durch den entsprechenden Großbuchstaben ersetzt werden.
    \tl_use:N \l_tmpa_tl
  }

\NewDocumentCommand \MeinBefehl {m}
  { \cletus_replace:n {#1} }
\ExplSyntaxOff

\begin{document}

\MeinBefehl{aus klein mach groß}

\end{document}

Die gewünschte Ausgabe wäre in diesem Fall »AUS/KLEIN/MACH/GROSS«.

gefragt 08 Jan '16, 23:19

Cletus's gravatar image

Cletus
1.6k75866
Akzeptiert-Rate: 75%

bearbeitet 09 Jan '16, 14:22

cgnieder's gravatar image

cgnieder
22.1k253463


\tl_to_uppercase:n und \tl_to_lowercase:n existieren zwar, sind aber nicht (mehr) dafür gedacht, Groß- und Kleinschreibung zu manipulieren, und werden gerüchteweise auch aus expl3 entfernt werden. Dafür gibt es

  • \tl_upper_case:n,
  • \tl_lower_case:n und
  • \tl_mixed_case:n.

Beschrieben werden sie in interface3 im Abschnitt l3candidates/Additions to l3tl. Wichtig zu wissen: sie expandieren ihr Argument!

Open in Online-Editor
\cs_new_protected:Npn \cletus_replace:n #1
  {
    \tl_set:Nn \l_tmpa_tl {#1}
    \tl_replace_all:Nnn \l_tmpa_tl {ß} {ss}
    \tl_replace_all:Nnn \l_tmpa_tl {~} {/}
    % Hier muss jetzt jeder Klein- durch den entsprechenden Großbuchstaben ersetzt werden.
    \tl_upper_case:n { \l_tmpa_tl }
  }

oder eventuell mit V-Argument (was ich persönlich bevorzugen würde):

Open in Online-Editor
\cs_new_protected:Npn \cletus_replace:n #1
  {
    \tl_set:Nn \l_tmpa_tl {#1}
    \tl_replace_all:Nnn \l_tmpa_tl {ß} {ss}
    \tl_replace_all:Nnn \l_tmpa_tl {~} {/}
    % Hier muss jetzt jeder Klein- durch den entsprechenden Großbuchstaben ersetzt werden.
    \tl_upper_case:V \l_tmpa_tl
  }
\cs_generate_variant:Nn \tl_upper_case:n { V }

Komplettes Beispiel:

Open in Online-Editor
\documentclass{article}
\usepackage[utf8]{inputenc}

\usepackage{expl3,xparse,etoolbox}
% es ist nötig, \linebreak robust zu machen, da \tl_upper_case:n sein Argument
% expandiert:
\robustify\linebreak

\ExplSyntaxOn
\cs_new_protected:Npn \cletus_replace:n #1
  {
    \tl_set:Nn \l_tmpa_tl {#1}
    \tl_replace_all:Nnn \l_tmpa_tl {ß} {ss}
    \tl_replace_all:Nnn \l_tmpa_tl {~} {/\linebreak[1]}
    % Hier muss jetzt jeder Klein- durch den entsprechenden Großbuchstaben ersetzt werden.
    \tl_upper_case:V \l_tmpa_tl
  }
\cs_generate_variant:Nn \tl_upper_case:n { V }

\NewDocumentCommand \MeinBefehl {m}
  { \cletus_replace:n {#1} }
\ExplSyntaxOff

\begin{document}

\MeinBefehl{aus klein mach groß}

\end{document}
Permanenter link

beantwortet 08 Jan '16, 23:33

cgnieder's gravatar image

cgnieder
22.1k253463
Akzeptiert-Rate: 60%

bearbeitet 09 Jan '16, 14:24

Wenn ich jetzt noch nach dem Schrägstrich einen Zeilenumbruch ermöglichen will, funktioniert das leider nicht mehr (vgl. obige Änderung).

(08 Jan '16, 23:52) Cletus

@Cletus wie ich schrieb: \tl_upper_case:n expandiert sein Argument. \linebreak ist aber kein robuster Befehl. In interface3, wo die Befehle beschrieben werden, wird auch auf dieses Problem hingewiesen und wie man es beheben kann: in dem man den entsprechenden Befehl robust macht. LaTeX2es Lösung mit \protect funktioniert nicht. Stattdessen kan man das Paket etoolbox laden und \robustify\linebreak in der Präambel hinzufügen, dann läuft's auch wieder.

(09 Jan '16, 14:21) cgnieder

@Cletus ich hab das mal als lauffähiges Beispiel hinzugefügt

(09 Jan '16, 17:23) cgnieder

@Clemens Wieso so umständlich? Einfach \slash statt / verwenden, denn

% latex.ltx, line 571:

\def\slash{/\penalty\exhyphenpenalty} % a/' that acts like a -'

(09 Jan '16, 19:33) Henri

Interessanter Hinweis, Henri, den \slash-Befehl kannte ich gar nicht. Wäre es nicht auch möglich, die Umwandlung in Großbuchstaben vor der Ersetzung der Leerzeichen vorzunehmen, um das Problem zu umgehen? Oder ich lasse es doch mit expl3 und verwende \MakeUppercase.

(09 Jan '16, 23:34) Cletus

Unschön an \tl_upper_case ist IMHO, dass es bisher AFAIK nur US-ASCII umwandelt, aber beispielsweise kein Umlaute oder ß. Mit \MakeUppercase kann man sich die Sonderbehandlung für ß und ggf. für Umlaute dagegen sparen. Die werden dort mit umgewandelt.

@Henri: Bitte entferne den Block-Code aus Deinem Kommentar. Der zerstört leider noch immer die Kommentarfunktion.

(10 Jan '16, 12:28) saputello

@Henry ich reagiere nur auf die Frage. Und \linebreak taugt doch ganz gut, wie man hier mit zerbrechlichen Befehlen umgehen muss. Der nächste kommt bestimmt...

(10 Jan '16, 12:35) cgnieder

@saputello man darf natürlich nicht vergessen, dass die Befehle und ihr Verhalten noch experimentell sind und noch weiterentwickelt werden. Joseph hat erst vor wenigen Tagen was in die Richtung gesagt: http://tex.stackexchange.com/questions/286650/how-to-make-tl-upper-casen-applied-to-diacritics-work-in-section-argument

(10 Jan '16, 12:41) cgnieder

@saputello offenbar kommt in den nächsten Tagen ein Update, nach dem dann gängige Akzente auch funktionieren werden (siehe Link meines vorigen Kommentars)

(13 Jan '16, 13:49) cgnieder
Ergebnis 5 von 9 show 4 more comments
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
×4
×3
×2

gestellte Frage: 08 Jan '16, 23:19

Frage wurde gesehen: 7,362 Mal

zuletzt geändert: 13 Jan '16, 13:49