由于 Windows 上的双重路径,调用 xindy 失败

由于 Windows 上的双重路径,调用 xindy 失败

在我的 windows10 机器上安装 MikTex 后,makeglossaries 出现问题。pdflatex 和 biber 工作正常,但调用时makeglossaries失败并显示以下错误消息:

$makeglossaries Main
makeglossaries version 4.36 (2018-03-07)
added glossary type 'main' (glg,gls,glo)
xindy  -L english -C duden-utf8 -I xindy -M "Main" -t "Main.glg" -o "Main.gls" "                                                                       Main.glo"
/d/local/thesis/C:/Program Files/MiKTeX2.9/scripts/xindy/../../xindy                                                                       /modules: No such file or directory at C:\Program Files\MiKTeX2.9\scripts\xindy\                                                                       xindy.pl line 402.

***Call to xindy failed***

Check 'Main.glg' for details

我退房了wolfie 的回答但发现这已经在xindy脚本中实现了。

错误似乎是在$real_cmd第 372 行的脚本中的变量中连接了路径。

有想法该怎么解决这个吗?

这是我的乳胶设置的简化版本:

主文本:

\documentclass[
 11pt,              
   english,
   a4paper,           
   DIV=11,            
   listof=numbered,
]{scrreprt}

% -------------------------------------------------------------------------
\setlength{\parskip}{0.75em}   
\usepackage{geometry}          
\geometry{bindingoffset=0.5cm,hmarginratio=3:4, bottom=4.5cm}

\widowpenalty10000          
\clubpenalty10000

%---- PACKAGES ----
%\usepackage{hyperref}      
\usepackage[hidelinks]{hyperref}    

\usepackage[utf8]{inputenc} 
\usepackage[english]{babel} 

\usepackage[T1]{fontenc}    
\usepackage{textcomp}       
\usepackage{lmodern}        
\usepackage{pdfpages}       
\pdfminorversion=7          
\usepackage{graphicx}       

\usepackage{tabularx}      
\usepackage{hhline}         
\renewcommand\arraystretch{1.1} 
\makeatletter               
\newcommand{\thickhline}{
    \noalign {\ifnum 0=`}\fi \hrule height 1pt
    \futurelet \reserved@a \@xhline
}
\makeatother

\def\hyph{-\penalty0\hskip0pt\relax}    

\usepackage{xcolor}     

\definecolor{bostonuniversityred}{rgb}{0.8, 0.0, 0.0}

% This is the interesting part I guess -------------------------------
\usepackage[section=section,numberedsection=autolabel,toc,nonumberlist,xindy]{glossaries}
\GlsSetXdyCodePage{duden-utf8}
\makeglossaries     
\input{glossary.tex}    
% ----------------------------------------------------------------- 

\usepackage[chapter]{minted}        
\usepackage{scrhack} 
\usepackage{listings}

\renewcommand{\listingscaption}{Code Snippets}
\renewcommand{\listoflistingscaption}{List of Code Snippet}


\usepackage[german=quotes]{csquotes}        
\MakeOuterQuote{"}

%---- BIBLIOGRAPHY ---
\usepackage[block=ragged,backend=biber,bibstyle=ieee]{biblatex}     
\addbibresource{Bibliography.bib}

\makeatletter
\def\blx@maxline{77}
\makeatother


\begin{document}

         \gls{someEntry} 
         \gls{someEntry2} 

    \newpage
    \printglossary[title=Glossary]
\end{document}

词汇表.tex:

\newglossaryentry{someEntry}{
    name={Some Entry},
    description={Some Description}
}
\newglossaryentry{someEntry2}{
    name={Some Entry 2},
    description={Some Description 2}
}

在生成的 pdf 文件中,名称是可见的,因此它正确读取了词汇表文件,但由于 makeglossaries 命令失败而无法打印它。

答案1

我深入挖掘了一下,找到了部分解决方案。但由于我的 karma 还不够,所以我无法将其作为评论发布(而且我不确定这是否是正确的方式)。

xindy.pl 第 372 行内容如下:

our $real_cmd = Cwd::realpath($0);

如果我添加

print "real_cmd: $real_cmd\n";

之后,它会打印

real_cmd: /c/Users/username/Desktop/TeX/auxdir/C:/Program Files/MiKTeX 2.9/scripts/xindy/xindy.pl

这是错误的。

将这些行放入名为的测试文件中test_Cwd.pl

#!/usr/bin/perl -w
use Cwd;
our $real_cmd = Cwd::realpath($0);
print "real_cmd: $real_cmd\n";

带有窗口路径的输出:

$ C:\\Users\\username\\Desktop\\test_Cwd.pl
real_cmd: /c/Users/username/Desktop/C:/Users/username/Desktop/test_Cwd.pl

在 Windows 上使用模拟 unix 路径的输出:

$ /c/Users/username/Desktop/test_Cwd.pl
real_cmd: /c/Users/username/Desktop/test_Cwd.pl

perl 行为上的这种差异是众所周知的,并描述在https://stackoverflow.com/a/46773471

可能的解决方案:

  1. 修复C:\Program Files\MiKTeX 2.9\miktex\bin\x64\xindy.exe在 msys 上执行 perl 的问题/c/Program\ Files/MiKTeX\ 2.9/scripts/xindy/xindy.pl。我不知道该怎么做,因为我找不到提供 xindy.exe 的包。
  2. 修复C:/Program Files/MiKTeX 2.9/scripts/xindy/xindy.pl将 Windows 样式路径转换为 ​​Unix 样式路径的问题(肮脏的黑客行为,如下所示)
  3. 修复 perl 解释器的Cwd包,将 Windows 样式的路径转换为 ​​Unix 样式的路径(通用解决方案,可能会破坏其他代码)

Msys 和 Cygwin 也具有cygpath有助于创建解决方法的实用程序:

您需要xindy.pl先修复平台检测,请参阅https://sourceforge.net/p/xindy/feature-requests/47/

然后替换xindy.pl第 372 行,如下所示

our $real_cmd = Cwd::realpath($0);

经过

our $real_cmd = "";
if ( $is_w32 ) {
    our $cygpath_cmdline = "cygpath \"$0\"";
    our $unixified_cmd_path = `$cygpath_cmdline`;
    $unixified_cmd_path =~ s/\r//g;
    $unixified_cmd_path =~ s/\n//g;
    our $real_cmd = Cwd::realpath($unixified_cmd_path);
} else {
    our $real_cmd = Cwd::realpath($0);
}

但是 xindy-lisp.exe 将无法读取 tempdir 文件名:

*** - PARSE-NAMESTRING: syntax error in filename
  "\"/c/Users/username/Desktop/TeX/auxdir/FVWzOBrFBF\"" at position 0

该文件确实存在,但 xindy-lisp.exe 似乎期望文件名不带,\"但带有单双引号相反。手动编辑命令行并删除\"使我更进一步。解析临时文件并从那里读取其他路径时,它再次失败。

我在 Windows 7 上将 git-bash(msy​​s,64 位)中的 perl 与 MiKTeX 64 位一起使用。据我所知,所有软件都已更新至最新版本,也许除了 perl。

$ perl --version

This is perl 5, version 26, subversion 1 (v5.26.1) built for x86_64- 
msys-thread-multi

附言:由于我刚接触 perl,所以代码风格可能不太好。欢迎提出建议!

相关内容