将字符串中的每个反斜杠替换为正斜杠

将字符串中的每个反斜杠替换为正斜杠

我想用\正斜杠替换宏(字符串)内的每个反斜杠/

该宏旨在包含 Windows 表示法中的文件名,该文件名应替换为有效的 (La)TeX 兼容文件名。我知道最好在源文件中使用此类字符串之前对其进行处理,但是:是否可以使用 (La)TeX 来做到这一点?

我的 MWE 是:

\documentclass{article}
\usepackage{etoolbox}

% The following macro is a placeholder.
% It should replace '\' by '/'
% #1: input
% #2: output
\newcommand{\replaceBS}[2]{%
  \edef\x{\noexpand\edef\noexpand#2{\noexpand\detokenize{\expandonce#1}}}%
  \x%
}

\begin{document}

\def\WindowsFilename{c:\files\examples\pictures\myfile.png}

\replaceBS{\WindowsFilename}{\TeXFilename}

Current result: \texttt{\TeXFilename}

Expected result: \texttt{c:/files/examples/pictures/myfile.png}

\end{document}

的解决方案\replaceBS应该可以与兼容pdflatex

xstring到目前为止,我已经尝试过使用该软件包,但没有成功。任何使用 TeX、LaTeX3、特殊软件包等的解决方案都值得欢迎。

只是为了确定:是的,我知道如何使用编辑器或外部工具进行替换;-)

答案1

\documentclass{article}

\makeatletter
\newcommand{\replaceBS}[2]{{\escapechar=`/ 
  \xdef#2{\expandafter\zap@space\detokenize\expandafter{#1} \@empty}}}
\makeatother

\begin{document}

\def\WindowsFilename{c:\files\examples\pictures\myfile.png}

\replaceBS{\WindowsFilename}{\TeXFilename}

Current result: \texttt{\TeXFilename}

Expected result: \texttt{c:/files/examples/pictures/myfile.png}

\end{document}

答案2

据我所知,Windows 版 MiKTeX 和 TeX Live 都接受被\替换的路径/,因此如果你将 定义\WindowsFilename

c:/files/examples/pictures/myfile.png

首先,你应该不会有任何问题。

然而,我知道普通用户可能不知道这一点并且习惯于 DOS 风格的路径。

如果您不打算在其他命令的参数中定义路径,则可以使用一些expl3功能:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\setWindowsPath}{mv}
 {
  \cs_new:Npn #1 { #2 }
 }
\NewDocumentCommand{\replaceBS}{mm}
 {
  \tl_set_eq:NN #2 #1
  \tl_replace_all:NVn #2 \c_backslash_other_tl { / }
 }
\tl_const:Nx \c_backslash_other_tl { \cs_to_str:N \\ }
\cs_generate_variant:Nn \tl_replace_all:Nnn { NV }
\ExplSyntaxOff

\setWindowsPath{\WindowsFilename}{c:\files\examples\pictures\myfile.png}

\replaceBS{\WindowsFilename}{\TeXFilename}

\show\WindowsFilename
\show\TeXFilename

\setWindowsPath{\WindowsFilenameS}{c:\files\example spaced\pictures\myfile.png}

\replaceBS{\WindowsFilenameS}{\TeXFilenameS}

\show\WindowsFilenameS
\show\TeXFilenameS

请注意,这会保留路径中的空格。还请注意,Windows 文件名中的反斜杠已被“中和”,因为它们的类别代码为 12。

> \WindowsFilename=\long macro:
->c:\files\examples\pictures\myfile.png.
l.22 \show\WindowsFilename

? 
> \TeXFilename=macro:
->c:/files/examples/pictures/myfile.png.
l.23 \show\TeXFilename

? 
> \WindowsFilenameS=\long macro:
->c:\files\example spaced\pictures\myfile.png.
l.29 \show\WindowsFilenameS

? 
> \TeXFilenameS=macro:
->c:/files/example spaced/pictures/myfile.png.
l.30 \show\TeXFilenameS

相关内容