我正在定义一个新命令,其中输入包含反斜杠,稍后会将其删除,因此我正在寻找一种方法来实现这一点。以下示例在反斜杠位于字符串前面时会将其删除,但当反斜杠位于字符串中间时会失败。
\documentclass{article}
\makeatletter
\newcommand{\removeabs}[1]{%
\ifcat\relax\noexpand#1%
\expandafter\expandafter\expandafter\@gobble\expandafter\string
\fi
#1%
}
\makeatother
\begin{document}
\removeabs{\the slash is removed here}
\removeabs{but not \here}
\end{document}
有人知道如何删除反斜杠吗,即使它位于字符串之间?
为什么我需要这个:我正在使用 pythontex 创建文件.tex,将被纳入主文本,并且两个步骤都使用一个新命令完成,形式为\命令{参数},其中参数参数是python代码中使用的选项,以及创建的tex文件的名称(文件.tex)问题在于参数包含斜线、连字符等(在我的情况下很常见),在 Windows 操作系统中甚至不允许将其作为文件名,因此需要在 pythontex 代码(以另存为文件)和 latex(以读取文件)中将其删除。例如:
\newcommand{\mycommand}[1]{
\begin{pycode}
plot[#1] %Pseudo line
save[#1.tex] %Pseudo line
\end{pycode}
\input{#1.tex}}
答案1
\documentclass{article}
\newcommand{\removeabs}[1]{%
%{\catcode92=9 \endlinechar-1 \scantokens\expandafter{\detokenize{#1}}}%
{\catcode92=9 \endlinechar-1 \scantokens{#1}}%
}
\begin{document}
\removeabs{\the slash is removed here}
\removeabs{and also \here}+++
\end{document}
但您的用例并不为人所知......
正如@A.Ellett 指出的那样,没有必要\detokenize
。
\documentclass{article}
\newcommand{\removeabs}[1]{%
{\catcode92=9 \endlinechar-1 \scantokens{#1}}%
}
\begin{document}
\removeabs{\the slash $E=mc^2$ is removed here}
\removeabs{and also \here}+++
\end{document}
也许您想存储在宏中,下面显示了如何做到这一点(但\x
这里使用并丢弃)。
但请注意,其中不应包含一些与 不兼容定义的活动字符\edef
。UTF ~
-8 编码没问题。
\documentclass{article}
\usepackage[T1]{fontenc}
\newcommand{\removeabs}[1]{%
{\catcode92=9 \endlinechar-1 \everyeof{\noexpand}\edef\x{\scantokens{#1}}\x}%
}
\begin{document}
\removeabs{\the slash $E=mc^2$ is~~~~removed here}
\removeabs{and also éééé \here}+++
\end{document}
感谢@A.Ellett!
答案2
和expl3
:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\removebs}{m}
{
\tl_set:Nn \l_tmpa_tl { #1 }
\regex_replace_all:nnN { \cC. } { \c{cs_to_str:N} \0 } \l_tmpa_tl
\tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff
\begin{document}
\removebs{\the slash is removed here}
\removebs{\the\ slashes are removed here}
\removebs{and also \here}
\end{document}
请注意,第一种情况下后面的空格\the
不会消失,因为它一开始就被忽略了。