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_seq
und erstelle dann mit eine neue Sequenz mit dem Text in \g_sbmcpm_listofauthors_lowercase_seq
Kleinbuchstaben \seq_map_function:NN
.
Wenn ich versuche, die Namen mit zu drucken, \seq_use:Nn
erhalte 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 \\
, \par
oder 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:Nn
ein 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}