我想用\
正斜杠替换宏(字符串)内的每个反斜杠/
。
该宏旨在包含 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