我正在尝试以下代码
\documentclass{article}
\usepackage{etoolbox,xstring}
\begin{document}
\def\FormatName#1{
\def\myname{My Name}
\def\name{#1}
\ifx\name\myname
\textbf{#1}
\else
#1
\fi
}
\FormatName{My Name}
\FormatName{My Name*}
\end{document}
\name
第一个调用会以粗体显示 My Name,但第二个调用不会。因此,如果我修改as的定义
\def\name{\StrDel{#1}{*}}
但这对于第一次或第二次调用都不起作用。我不确定我在这里做错了什么。有什么想法吗?
答案1
为了看看
\ifx<csnameA><csnameB>
<true>
\else
<false>
\fi
将遵循<true>
或<false>
分支,始终最好先发出\show<csnameA>
和,\show<csnameB>
然后查看它们的评估结果。让我们使用您的第一个示例:
\documentclass{article}
\begin{document}
\def\FormatName#1{%
\def\myname{My Name}%
\def\name{#1}%
\show\myname\show\name
\ifx\name\myname
\textbf{#1}%
\else
#1%
\fi
}
\FormatName{My Name}
\FormatName{My Name*}
\end{document}
该.log
文件显示
> \myname=macro:
->My Name.
> \name=macro:
->My Name.
这些显然是相同的。然后它还显示:
> \myname=macro:
->My Name.
> \name=macro:
->My Name*.
这些显然是不同的。因此,输出符合预期。现在查看使用更新的设置xstring
:
\documentclass{article}
\usepackage{xstring}
\begin{document}
\def\FormatName#1{%
\def\myname{My Name}%
\def\name{\StrDel{#1}{*}}%
\show\myname\show\name
\ifx\name\myname
\textbf{#1}%
\else
#1%
\fi
}
\FormatName{My Name}
\FormatName{My Name*}
\end{document}
演出.log
> \myname=macro:
->My Name.
> \name=macro:
->\StrDel {My Name}{*}.
> \myname=macro:
->My Name.
> \name=macro:
->\StrDel {My Name*}{*}.
在这两种情况下,这些条目显然不匹配。现在(再次),输出符合预期。
如果要从*
中删除\name
,则需要完全展开删除并在比较中使用它。xstring
提供此扩展和存储作为其大多数字符串操作宏的一部分。 具体来说,对于,在末尾\StrDel
添加一个可选项:[<csname>]
\documentclass{article}
\usepackage{xstring}
\begin{document}
\def\FormatName#1{%
\def\myname{My Name}%
\StrDel{#1}{*}[\name]%
\show\myname\show\name
\ifx\name\myname
\textbf{#1}%
\else
#1%
\fi
}
\FormatName{My Name}
\FormatName{My Name*}
\end{document}
您还可以使用etoolbox
删除(第一个)*
:
\documentclass{article}
\usepackage{etoolbox}
\begin{document}
\def\FormatName#1{%
\def\myname{My Name}%
\def\name{#1}%
\patchcmd{\name}{*}{}{}{}%
\show\myname\show\name
\ifx\name\myname
\textbf{#1}%
\else
#1%
\fi
}
\FormatName{My Name}
\FormatName{My Name*}
\end{document}
如果你想删除全部 *
,可以使用regexpatch
。
答案2
\def
不解释替换文本,因此测试My Name
显然\StrDel{My Name*}{*}
会失败。
您可以使用expl3
(通过xparse
)并获得更多信息:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\setspecialnames}{m}
{
\seq_gset_from_clist:Nn \g_ankush_specialnames_seq { #1 }
}
\seq_new:N \g_ankush_specialnames_seq
\tl_new:N \l_ankush_testname_tl
\NewDocumentCommand{\FormatName}{m}
{
\tl_set:Nn \l_ankush_testname_tl { #1 }
\tl_remove_all:Nn \l_ankush_testname_tl { * }
\seq_if_in:NVTF \g_ankush_specialnames_seq \l_ankush_testname_tl
{
\textbf{#1}
}
{
#1
}
}
\ExplSyntaxOff
\setspecialnames{My Name, A. Uthor}
\begin{document}
\FormatName{My Name} \FormatName{My Name*}
\FormatName{A. Uthor} \FormatName{A. Uthor*}
\FormatName{W. Riter}
\end{document}