expl3: 改行を含む小文字のシーケンス要素

expl3: 改行を含む小文字のシーケンス要素

短いテキスト (本の著者名) がシーケンスに保存されています。著者名の中には長いものもあるため、手動で改行 ( \\) を挿入する必要があります。特定のケースでは、これらの名前をすべて小文字で入力する必要があります。

ご協力ありがとうございましたジョセフ・ライト小文字は段落区切りを含むテキストでは正常に機能します\\)。

しかし、今は、テキストをシーケンスに保存し、を使用し\g_sbmcpm_listofauthors_seqて小文字のテキストを含む新しいシーケンスを作成します。\g_sbmcpm_listofauthors_lowercase_seq\seq_map_function:NN

名前を で印刷しようとすると、\seq_use:Nnコンパイル エラーが発生します。名前に が含まれていない場合は \\正常に動作します。ただし、 が含まれている場合は、トークンを含む文字列がシーケンスの最後の位置にある場合にのみ動作します。( 、 、\\のいずれを使用しても問題ありません)。次のようなエラー メッセージが表示されます。\\\par\newline

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

\\での代わりに 文字\seq_use:Nnを使用すると、;エラーは次のようになります。

! Undefined control sequence.
<argument> \\

l.54     \printauthorslowercase

完全なコードは次のとおりです。

\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}

答え1

よく分かりませんが、\\に渡すことに問題はないと思います\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}

関連情報