我想将由字母、数字和控制序列组成的标记列表转换为小写\\
。我尝试使用\str_lowercase:n
,但控制序列未覆盖文本。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\lowertl}{m}{%
\tl_set:Nn \l_tmpa_tl {#1}
\str_lowercase:f {\tl_to_str:N \l_tmpa_tl}
}
\ExplSyntaxOff
\begin{document}
\lowertl{This is my\\ Text}
\end{document}
运行 xelatex 的输出是:
this is my““ text
是否有一种简单的方法来迭代标记列表中的标记并仅将字母小写?
答案1
更新 2020-01-14
LaTeX 内核现在具有\\
强大的开箱即用功能。与最新expl3
函数一起使用时\text_lowercase:n
,无需进行额外调整即可使用。原始答案中关于字符串的评论相对文本仍然有效:您正在改变文本的大小写。
原始答案
该函数\str_lowercase:n
用于制作字符串小写,并且用于程序数据而不是文本。你想要\text_lowercase:n
。唯一的问题是\\
不是引擎强大的,并且的实现 期望“文本”是字符标记、扩展为字符标记的东西或引擎强大的命令。我们可以通过在本地使引擎强大来\text_lowercase:n
解决这个问题:\\
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand \LowerCase { m }
{
\group_begin:
\cs_set_protected:Npx \\ { \exp_not:o \\ }
\text_lowercase:n {#1}
\group_end:
}
\ExplSyntaxOff
\begin{document}
\LowerCase{This is my\\Text}
\end{document}
如果你\\
在全球范围内实现稳健,那么一切都将保持可扩展性
\documentclass{article}
\usepackage{etoolbox}
\robustify\\
\usepackage{xparse}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand \LowerCase { m }
{ \text_lowercase:n {#1} }
\ExplSyntaxOff
\begin{document}
\LowerCase{This is my\\Text}
\end{document}
请注意,在任何一种情况下,都不需要存储#1
在标记列表变量中。
答案2
这不是一个可扩展的版本(而且我不确定这是否是真正要求的)
基本思想是在出现的地方分割标记\\
,将各部分存储在\seq
变量中,更改列表中符号的大小写并将各部分粘合在一起,然后\\
再次填充。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\lowertl}{m}{
\seq_set_split:Nnn \l_tmpa_seq {\\} {#1}
\seq_map_inline:Nn \l_tmpa_seq {
\seq_put_right:Nx \l_tmpb_seq {\str_lowercase:n {##1}}
}
\seq_clear:N \l_tmpa_seq
\seq_map_inline:Nn \l_tmpb_seq {
\int_incr:N \l_tmpa_int
\int_compare:nNnTF { \l_tmpa_int } < {\seq_count:N \l_tmpb_seq }
{\seq_put_right:Nn \l_tmpa_seq { ##1 \\ } }
{\seq_put_right:Nn \l_tmpa_seq { ##1} }% Don't add the \\
}
\seq_use:Nn \l_tmpa_seq {}
}
\ExplSyntaxOff
\begin{document}
\noindent\lowertl{This is my\\ Text @\\ FOO OTHER STUFF #}
\end{document}