expl3: Sequenzelemente in Kleinbuchstaben mit Zeilenumbrüchen

expl3: Sequenzelemente in Kleinbuchstaben mit Zeilenumbrüchen

Ich habe einige kurze Texte (Buchautorennamen) in einer Sequenz gespeichert. Einige Autorennamen sind lang, deshalb muss ich manuell einen Zeilenumbruch ( \\) einfügen. In einem bestimmten Fall muss ich diese Namen komplett in Kleinbuchstaben setzen.

Dank der Hilfe vonJoseph Wright, DieKleinbuchstaben funktionieren gut bei Texten, die Absatzumbrüche enthalten( \\).

Aber jetzt speichere ich den Text in einer Sequenz \g_sbmcpm_listofauthors_seqund erstelle dann mit eine neue Sequenz mit dem Text in \g_sbmcpm_listofauthors_lowercase_seqKleinbuchstaben \seq_map_function:NN.

Wenn ich versuche, die Namen mit zu drucken, \seq_use:Nnerhalte ich Kompilierungsfehler. Wenn die Namen nicht vorhanden sind, \\funktioniert es einwandfrei. Wenn jedoch einige \; vorhanden sind, funktioniert es nur, wenn sich die Zeichenfolge mit dem \\Token an der letzten Position der Sequenz befindet. (Es spielt keine Rolle, ob ich \\, \paroder verwende \newline.) Ich erhalte eine Fehlermeldung wie diese

! Undefined control sequence.
<inserted text> ... }{Author NameOne \\ TooLong}\\
                                                  \__xparse_start_expandable...
l.54     \printauthorslowercase

Wenn ich statt \\in \seq_use:Nnein Zeichen verwende, ;sieht der Fehler folgendermaßen aus:

! Undefined control sequence.
<argument> \\

l.54     \printauthorslowercase

Unten ist der vollständige Code:

\documentclass{article}

\usepackage{xparse}
\usepackage{tikz}

\ExplSyntaxOn
\NewDocumentCommand \LowerCase { m }
  {
    \cs_set_eq:NN \__texnik_newline: \\
    \cs_set_protected:Npx \\ { \exp_not:o \\ }
    \tl_lower_case:n {#1}
    \cs_set_eq:NN \\ \__texnik_newline:
  }

\cs_new:Npn \add_lowerauthor #1
{
  \tl_set:No \l_tmpa_tl {\LowerCase{#1}}
  \seq_gput_right:No \g_sbmcpm_listofauthors_lowercase_seq {\l_tmpa_tl}
  \seq_log:N \g_sbmcpm_listofauthors_lowercase_seq
}


\seq_new:N \g_sbmcpm_listofauthors_seq
\DeclareDocumentCommand{\mainauthor} {m} {%
  \seq_put_right:Nn \g_sbmcpm_listofauthors_seq {#1}
}


\seq_new:N \g_sbmcpm_listofauthors_lowercase_seq
\NewDocumentCommand \printauthorslowercase { }
  {
    \seq_map_function:NN \g_sbmcpm_listofauthors_seq \add_lowerauthor
    \seq_use:Nn \g_sbmcpm_listofauthors_lowercase_seq  {;}
  }

\ExplSyntaxOff

%% This works
% \mainauthor{Author NameOne}
% \mainauthor{Author NameTwo}

%%% This also works
% \mainauthor{Author NameOne}
% \mainauthor{Author NameTwo \\ TooLong}

%%% This doesn't works
\mainauthor{Author NameOne \\ TooLong}
\mainauthor{Author NameTwo}

\begin{document}
\begin{tikzpicture}[overlay, remember picture]
  \node[align=left] (text1)
  {%
    \printauthorslowercase
  };
\end{tikzpicture}

\end{document}

Antwort1

Ich bin nicht sicher, ob ich folgen kann, aber ich sehe kein Problem darin, \\zu zu übergehen \text_lowercase:n.

\documentclass{article}

\usepackage{xparse}
\usepackage{tikz}

\ExplSyntaxOn

\NewDocumentCommand{\mainauthor} {m}
 {
  \seq_put_right:Nn \g_sbmcpm_listofauthors_seq {#1}
 }

\NewDocumentCommand \printauthorslowercase { }
 {
  \seq_map_function:NN \g_sbmcpm_listofauthors_seq \sbmcpm_add_lowerauthor:n
  \seq_use:Nn \l_sbmcpm_listofauthors_lowercase_seq  {;}
 }

\seq_new:N \g_sbmcpm_listofauthors_seq
\seq_new:N \l_sbmcpm_listofauthors_lowercase_seq

\cs_new_protected:Npn \sbmcpm_add_lowerauthor:n #1
 {
  \seq_put_right:Nn \l_sbmcpm_listofauthors_lowercase_seq { \text_lowercase:n {#1} }
 }

\ExplSyntaxOff

\mainauthor{Author NameOne \\ TooLong}
\mainauthor{Author NameTwo}

\begin{document}

\begin{tikzpicture}[overlay, remember picture]
  \node[align=left] (text1)
  {%
    \printauthorslowercase
  };
\end{tikzpicture}

\end{document}

verwandte Informationen