我必须确定字符串末尾是否存在波浪号(~),但是我看到的结果根据宏而不同,例如:
\documentclass{article}
\usepackage{ifthen}
\usepackage{trimspaces}
\usepackage{xstring}
\makeatletter
\newcommand{\ifendSwith}[2][~]{%
\IfEndWith{#2}{#1}{true}{false}%
}
\makeatother
\makeatletter
\newcommand*{\trimend}[1]{%
\trim@post@space{#1}%
}
\makeatother
\begin{document}
\ifendSwith{\textasciitilde }{\trimend{. -string~}} \par
\ifendSwith{\textasciitilde{} }{\trimend{. -string~}} \par
\ifendSwith{$\sim$}{\trimend{. -string~}} \par
\ifendSwith{\~{}}{\trimend{. -string~}} \par
\ifendSwith{~}{\trimend{. -string~}} \par
\ifendSwith{\trimend{. -string~}} \par
% How test value of a command with `\ifthenelse` and `\equal`?
\ifthenelse{\equal{\ifendSwith{ -string~}}{true}}
{
The string ' -string$\sim$' ends with a tilde (\~{}). \footnote{This is a footnote}. \par
}{
The string ' -string$\sim$' DOES NOT end with a tilde (\textasciitilde{}). \footnote{This is a footnote}. \par
}
\end{document}
\IfEndWith 宏似乎可以正确识别字符串 '. -string~' 末尾的波浪符号 (~),但是 \ifthenelse{\equal{\ifendSwith{ -string~}} 宏却不能。
非常感谢任何建议或想法。
对于那些想知道“为什么他们需要检查字符串末尾的波浪号?”的人,我需要使用不间断字符作为较长文本字符串的一部分,但需要知道波浪号是否以及何时已经存在于所讨论的子字符串的末尾。
谢谢阅读。
更新:
抱歉,我之前的帖子没有表达得那么清楚。下面是我尝试测试 #1 的原始代码,其中最后一个字符为波浪符号 (~)(#2 可以是任何文本):
\if \ifendswith{~}{#1}
\myuline{\gls[hyper=true]{\trimend{#1}#2}}\index{#2!#1}%
\else
\myuline{\gls[hyper=true]{#1 #2}}\index{#2!#1}%
\fi
当 #1 = 'string~' 时\ifendswith{~}{#1}
,不是正如我所希望的那样,评估为 .true.,并且 \if \else \fi 代码没有按预期工作。
再次对我应该在原始帖子中包含的代码表示歉意。
答案1
这显示了字符串的三个版本,以无空格结尾、以空格结尾~
和以正常空格结尾。
首先按原样使用,然后在修剪任何尾随空格后使用,最后在修剪并添加~
不间断空格后使用。
\documentclass{article}
\newcommand\sA{-string}
\newcommand\sB{-string~}
\newcommand\sC{-string }
\newcommand\trimsp{\ifhmode\unskip\unskip\unpenalty\fi}
\begin{document}
\sA!
\sB!
\sC!
\bigskip
\sA\trimsp!
\sB\trimsp!
\sC\trimsp!
\bigskip
\sA\trimsp~!
\sB\trimsp~!
\sC\trimsp~!
\end{document}
答案2
没有xstring
命令是可扩展的。所以你的\equal{\ifendSwith{ -string~}}{true}
命令总是true
与完全不同的东西进行比较。而你使用可选参数的定义使情况变得更糟。
如果你尝试完全扩展
\edef\test{\ifendSwith{ -string~}}
\show\test
你得到
! Argument of \reserved@a has an extra }.
如果你忽略错误,你就会得到
> \test=macro:
->\let \reserved@d =[\def \par .
这绝对不同于true
。
您可以使用以下代码删除尾随~
。将与参数的最后一个标记进行比较\c_tilde_str
(作为字符串),在这种情况下,仅传递到倒数第二个标记;否则传递整个参数。
\documentclass{article}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\removetie}{m}
{
\str_if_eq:eeTF { \c_tilde_str } { \tl_item:nn { #1 } { -1 } }
{
\tl_range:nnn { #1 } { 1 } { -2 }
}
{
#1
}
}
\ExplSyntaxOff
\begin{document}
\removetie{string}X
\removetie{string~}X
\edef\test{\removetie{string~}}\texttt{\meaning\test}X
\end{document}