我使用 expl3 编写了一个命令,如果可选参数指定为 * 或 **,则该命令的行为会有所不同。该命令适用于数学环境,并且应该根据第一个参数使用直立下划线呈现第二个参数。我发现此命令的行为存在三个问题:
- * 和 ** 无法识别
- 显示多余的连字符 (-)
- 显示多余的引号(“)
\documentclass{article}
\usepackage{mathtools}
\usepackage{xparse}
\ExplSyntaxOn
% Render underscored with some variation of strict
\NewDocumentCommand{\strict}{O{strict} m}
{
\str_if_eq:eeTF {\str_item:nn {#1} {-1}} {-}
{
\show_strict:nn {{#1}strict} {#2}
}
{
\show_strict:nn {#1} {#2}
}
}
\cs_new_protected:Npn \show_strict:nn #1 #2
{
\msg_term:n {show_strict \ P1 \ = \ #1}
\msg_term:n {show_strict \ P2 \ = \ #2}
\str_set:Nn \l_tmpa_str {#1}
\str_set:Nn \l_tmpb_str {#2}
\msg_term:n {\l_tmpa_str = \l_tmpa_str}
\str_case:nnF {\l_tmpa_str}
{
{
{*}
{ \underset {\mathrm{(semi-strict,strict)}} {#2} }
}
{
{**}
{ \underset {\mathrm{semi-strict (strict)}} {#2} }
}
}
{
\underset {\mathrm{\l_tmpa_str}} {\l_tmpb_str}
}
}
\ExplSyntaxOff
\begin{document}
\begin{enumerate}
\item Test $\strict{{default}}$ \\*
expect underset with upright "strict"
\item Test $\strict[semi-]{{hyphen}}$
expect underset with upright "semi-strict"
\item Test $\strict[*]{{star}}$
expect underset with upright "(semi-strict,strict)"
\item Test $\strict[**]{{starstar}}$
expect underset with upright "semi-strict (strict)"
\end{enumerate}
\foo
\end{document}
答案1
你的语法是\str_case:nnF
错误的;第一个参数是要查找匹配的字符串;第二个参数应该是这样的形式
{<string-a>}{<code>}
{<string-b>}{<code>}
...
并且您还佩戴了错误的附加牙套。
\documentclass{article}
\usepackage{mathtools}
\usepackage{xparse}
\ExplSyntaxOn
% Render underscored with some variation of strict
\NewDocumentCommand{\strict}{O{strict} m}
{
\str_if_eq:eeTF {\str_item:nn {#1} {-1}} {-}
{
\show_strict:nn {{#1}strict} {#2}
}
{
\show_strict:nn {#1} {#2}
}
}
\cs_new_protected:Npn \show_strict:nn #1 #2
{
\iow_term:n {show_strict ~ P1 ~ = ~ #1}
\iow_term:n {show_strict ~ P2 ~ = ~ #2}
\str_case:nnF {#1}
{
{*} { \underset {\textup{(semi-strict,~strict)}} {#2} }
{**} { \underset {\textup{semi-strict~(strict)}} {#2} }
}
{
\underset {\textup{#1}} {#2}
}
}
\ExplSyntaxOff
\begin{document}
\begin{enumerate}
\item Test $\strict{{default}}$ \\*
expect underset with upright "strict"
\item Test $\strict[semi-]{{hyphen}}$
expect underset with upright "semi-strict"
\item Test $\strict[*]{{star}}$
expect underset with upright "(semi-strict,strict)"
\item Test $\strict[**]{{starstar}}$
expect underset with upright "semi-strict (strict)"
\end{enumerate}
\end{document}
而不是\mathrm
您应该使用\textup
(否则连字符将是减号并且空格将被忽略)。
这是控制台输出:
*************************************************
* show_strict P1 = strict
*************************************************
*************************************************
* show_strict P2 = {default}
*************************************************
*************************************************
* show_strict P1 = {semi-}strict
*************************************************
*************************************************
* show_strict P2 = {hyphen}
*************************************************
*************************************************
* show_strict P1 = *
*************************************************
*************************************************
* show_strict P2 = {star}
*************************************************
*************************************************
* show_strict P1 = **
*************************************************
*************************************************
* show_strict P2 = {starstar}
*************************************************
答案2
当你这样做
\str_set:Nn \l_tmpa_str {#1}
\str_set:Nn \l_tmpb_str {#2}
您正在将变量设置为 TeX 字符串,从而删除标记的含义。特别是,{
和}
不再是“特殊”的,而是以您看到的“随机”引号/连字符的形式出现。在您的示例中,根本没有理由存储这些,但如果您这样做,请使用tl
。
第二个问题是
\str_case:nnF {\l_tmpa_str}
比较确切地文本\l_tmpa_str
与每个案例。它们永远不会匹配,所以你得到了分支F
。你想看看文本本身,最简单的方法是
\str_case:nnF {#2}
或者如果你真的或许想储存它
\cs_generate_variant:Nn \str_case:nnF { V }
...
\str_case:VnF \l_tmpb_str
访问价值变量。同样,我怀疑你在这里想要一个标记列表测试,而不是字符串测试:
\tl_set:Nn \l_tmpb_tl {#2}
\tl_case:NnF \l_tmpb_tl
尽管如前所述,我认为没有必要存储输入。