答案1
如果您希望更改宏的定义,\currfileabsdir
以便将类别 12(其他)的显式反斜杠字符替换为类别 12(其他)的(正)斜杠字符,您可以尝试如下操作:
\documentclass{article}
\usepackage[abspath]{currfile}
\ExplSyntaxOn
\cs_set:Npn \ReplaceBackslashesWithForwardSlashesInMacro #1
{
\exp_args:Nno \use:n { \str_set:Nn \l_tmpa_str} {#1}
\regex_replace_all:nnN{\\}{/} \l_tmpa_str
\exp_args:NnV \use:n {\cs_gset:Npn #1 } \l_tmpa_str
}
\ExplSyntaxOff
\begin{document}
Before patching \verb|\currfileabsdir|:
\texttt{\currfileabsdir}
\ReplaceBackslashesWithForwardSlashesInMacro{\currfileabsdir}
After patching \verb|\currfileabsdir|:
\texttt{\currfileabsdir}
\bigskip\hrule\bigskip
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Let's define some other macro whose expansion contains backslashes:
\begingroup
\catcode`\/=0
\catcode`\\=12
/gdef/SomeMacroWithBackslashes{\home\knoppix\Desktop\Zu Sichern\LaTeX Code\}
/endgroup
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Before patching \verb|\SomeMacroWithBackslashes|:
\texttt{\SomeMacroWithBackslashes}
\ReplaceBackslashesWithForwardSlashesInMacro{\SomeMacroWithBackslashes}
After patching \verb|\SomeMacroWithBackslashes|:
\texttt{\SomeMacroWithBackslashes}
\end{document}
您说您在 Windows 上使用 MiKTeX - 因此我怀疑斜杠和反斜杠的混合是导致您出现问题的唯一原因:
Microsoft .NET 文章“Windows 系统上的文件路径格式”的“规范化分隔符”部分,网址:https://docs.microsoft.com/en-us/dotnet/standard/io/file-path-formats,说道:
“所有正斜杠 (
/
) 都将转换为标准 Windows 分隔符,即反斜杠 (\
)。如果存在它们,则前两个斜杠后面的一系列斜杠将折叠为单个斜杠。”因此,在最新的 Windows 平台上,在属于 Windows 高级程序员接口的例程方面,许多情况下都可以混合使用斜杠和反斜杠。
但我不知道 LaTeX 的用于解析/分割目录路径和文件名的宏/例程如何处理反斜杠...... (过去我曾经深入研究过这些细节,但随着时间的推移,很多事情都发生了变化,现在我有点厌倦让自己跟上时代了。当我真的需要了解当前的技术水平时,我会研究众多文献中的哪些实际上提供了信息并尝试查找 - 这里是带有几个链接的列表: Kpathsea 手册, 源2e.pdf, 源3.pdf, 界面3.pdf, 电子书/来源, tex.web/计算机与排版 B 卷,TeX:程序, 总溶解固体, e-TeX 手册, XeTeX 参考指南, XeTeX 伴侣, LuaTeX 参考手册, pdfTeX 用户手册, ISO 32000(PDF), Web2C 手册, xparse-手册, MiKTeX 手册, TeX Live 指南 。
我之所以写“很多情况”,是因为在某些 Windows 平台上,斜杠和反斜杠的混合使用不起作用。例如,我在 MS-DOS/Windows 3.1、Windows 95 和 Windows 98 等旧版平台的命令提示符上遇到了问题。例如,Chris Hoffman 在文章“为什么 Windows 使用反斜杠而其他一切都使用正斜杠”的“这有什么关系?”部分中提到,网址:https://www.howtogeek.com/181774/why-windows-uses-backslashes-and-everything-else-uses-forward-slashes/,该更新于 2018 年 7 月 31 日,其中指出“打开”对话框中的路径如果使用斜杠而不是反斜杠则不起作用。该文章附带了一张很好的屏幕截图,显示了在 Windows 7 计算机上使用此对话框时错误消息“文件名无效”是如何显示的。
“4 绝对路径”一节currfile 软件包手册说:
宏定义中的信息
\currfileabsdir
是从文件中检索的\jobname.fls
。
如果文件\jobname.fls
是不可读在 LaTeX 运行期间, 的扩展\currfileabsdir
会产生空值。
为了\jobname.fls
创建文件,需要使用编译器选项 调用 TeX 引擎-recorder
。然而,MiKTeX 还有另一个特点:
\jobname.fls
在当前 LaTeX 运行中使用 MiKTeX 时,会从上次 LaTeX 运行期间创建的文件中检索信息,然后再销毁该文件并重新创建。这意味着:在第一次运行 LaTeX 时,没有
\jobname.fls
来自前一次运行的文件可供读取。因此在 MiKTeX 中第一次运行 LaTeX 时,扩展\currfileabsdir
会产生空值,因此在 MiKTeX 中第一次运行 LaTeX 时\input{\currfileabsdir-AnotherFile}
就像\input{-AnotherFile}
。这种情况可能是问题的根源。
因此,与其用(正)斜杠替换反斜杠,不如需要一个例程来找出当前的 latex 运行是否是第一个 latex 运行,并在这种情况下为 的定义提供默认值\currfileabsdir
。这可以通过例如将定义宏的指令写入 .aux 文件并检查所讨论的宏是否已定义来完成:在第一个 LaTeX 运行期间,还没有 .aux 文件,因此无法执行来自 .aux 文件的宏定义指令。在后续的 LaTeX 运行中,将执行指令并定义宏。
或者检查的扩展是否\currfileabsdir
产生空,如果是这种情况,\currfileabsdir
用一些默认值覆盖等的空定义也可能是一个可行的选择。
另一种方法是在开始时(甚至在之前)检查\documentclass
是否\IfFileExists
已经\jobname.fls
存在且可供读取,并相应地设置标志。在序言中,如果相应地设置了标志,则使用\currfileabsdir
某些默认值覆盖 etc 的空定义。
答案2
这是你想要的吗?
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\cs_set:Npn \path_set_format:n #1
{
\str_set:Nn \l_tmpa_str{#1} % #1: path
old:~\str_use:N \l_tmpa_str\par
\regex_replace_all:nnN{\\}{/} \l_tmpa_str
new:~\str_use:N \l_tmpa_str
}
\path_set_format:n{C:\User\username\Desktop\latex}
\ExplSyntaxOff
\end{document}