У меня есть короткий текст (имена авторов книг), сохраненный в последовательности. Некоторые имена авторов длинные, и поэтому мне приходится вручную вставлять разрыв строки (\\
). В конкретном случае мне приходится набирать эти имена полностью строчными буквами.
Благодаря помощиДжозеф Райт,Нижний регистр отлично работает с текстом, содержащим разрывы абзацев.( \\
).
Но теперь я сохраняю текст в последовательности \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}