ifx 宏未按预期运行

ifx 宏未按预期运行

我正在尝试以下代码

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

在此处输入图片描述

相关内容