TeXworks 和命令行编译成功,但 TeXShop 产生不同的结果

TeXworks 和命令行编译成功,但 TeXShop 产生不同的结果

背景:

正如我之前的问题一样,如果在预编译的 .fmt 文件中使用,则无法获取真正的 currfile,我试图通过生成文件来加快编译速度.fmt。下面的示例测试将标记的值\MyToken设置为两个破折号之间的文件名部分。

我是不是当我使用时获得所需的行为TeXShop 预编译.fmt文件。但是,如果我使用 或命令行编译,一切就会按预期进行。我怀疑调用的脚本TeXworks有些不对劲,但不确定。MyLaTeX.engineTeXShop

保存MyPreamble.tex如下定义后,我首先通过命令行编译前言:

    pdflatex -ini -jobname=MyPreamble "&pdflatex MyPreamble.tex\dump"

然后我尝试用四种不同的方式来处理这个序言foo-x-bar.tex


  1. 命令行编译(作品):

    pdflatex  --file-line-error --shell-escape -fmt=MyPreamble -recorder --synctex=1                   foo-x-bar.tex
    

    产生正确的结果(没有红色错误消息):

    在此处输入图片描述

    此外,以下操作(更改文件名的指定方式,请参阅下面的“更新”部分)也有效:

    pdflatex  --file-line-error --shell-escape -fmt=MyPreamble -recorder --synctex=1                    ./foo-x-bar.tex
    
  2. 使用 TeXworks (作品):

    配置MyLaTeX

    在此处输入图片描述

    我得到与命令行编译相同的结果(同样,没有红色错误消息)。

  3. 使用TeXShop才不是工作):

    使用 TeXShop 可以做到不是完全一样。我已将以下文件另存为MyLaTeX.engine

    #!/bin/sh
    bfname=$(dirname "$1")/"`basename "$1" .tex`"
    pdflatex --file-line-error --shell-escape -fmt=MyPreamble -recorder --synctex=1 "$bfname"
    

    MyLaTeX从调用TeXShop,我收到可怕的红色错误消息:

    在此处输入图片描述

  4. 编译foo-x-barComplete.tex,非常简单:

    \input{MyPreamble.tex}
    \input{foo-x-bar.tex}
    

    直接通过LaTeXTeXShop然后pfdlatexTeXworks一切也运行正常(没有红色错误消息)。


因此,问题仅有的发生于TeXShop 预编译.fmt文件。


更新:

  • 发布问题后,我确实看到运行中的一个区别,TeXShop即文件名以 为前缀./。我正在使用以下命令提取第一和第二个破折号之间的文本:

    \StrBefore{\themainfile}{.}[\CurrentFileName]%
    \StrBetween[1,2]{\CurrentFileName}{-}{-}[\ExtractedValue]
    

    这似乎是问题所在(因为文件名中现在有两个点)。因此,我尝试了一个明显的解决方法,即提取文件名 .tex

    \StrBefore{\themainfile}{.tex}[\CurrentFileName]%
    

    TeXShop 现在我用和得到了相同的结果TeXworks现在两者都显示可怕的错误消息!!!

    好的,修复方法就在这段代码或.engine文件中。

    然而需要注意的是,在./文件名前加上前导的命令行调用没有问题。

临时解决方案:

找到了一个临时解决办法:

    \StrBetween[1,2]{\themainfile}{-}{-}[\ExtractedValue]%

但我更愿意找到一种方法,从删除扩展名的文件名中提取它,这就是上面的代码尝试做的事情。


代码:MyPreamble.tex

% Based on egreg's answer at https://tex.stackexchange.com/questions/80453/cant-get-real-currfile-if-used-in-precompiled-fmt-file
\documentclass{article}
\usepackage{xcolor}
\usepackage{xstring}
\usepackage{lipsum}
\usepackage[realmainfile]{currfile}% 

\newcommand*{\Debug}[1]{\par\noindent\textcolor{blue}{#1}\par}%
\newcommand*{\Error}[1]{\par\noindent\textcolor{red}{#1}\par}%

\newtoks{\MyToken}
\MyToken={oo}% set default value
\AtBeginDocument{%
    \getmainfile
    \Debug{Debug: themainfile = "\themainfile"}%
    \StrBefore{\themainfile}{.}[\CurrentFileName]% 
    \Debug{Debug: CurrentFileName = "\CurrentFileName"}%
    \StrBetween[1,2]{\CurrentFileName}{-}{-}[\ExtractedValue]%
    \Debug{Debug: ExtractedValue = "\ExtractedValue"}%
    %
    %\StrBetween[1,2]{\jobname}{-}{-}[\ExtractedValue]% this works
    \IfStrEq*{\ExtractedValue}{\the\MyToken}{}{%
        \Error{Error: MyToken (middle) was "\the\MyToken",
                but was expected to be "\ExtractedValue".}%
    }%
}
%% ----- preamble ends here

代码:foo-x-bar.tex

% This file need to be named in three parts separated by two dashes.
% This need to be set to be the value in between the two dashes. So,
% if this file is named "foo-x-bar.tex", then this needs to be "x"
\MyToken={x}%

\begin{document}
    \lipsum[1]
\end{document}

代码:

答案1

当文件位于同一目录中时(这里就是这种情况),

$(dirname "$1")

返回.;所以

bfname=$(dirname "$1")/"`basename "$1" .tex`"

当文件foo-x-bar.tex存储时

./foo-x-bar.tex

作为 的值bfname。只需使用

bfname="$1"

$1当然也可以直接使用)。

bfname="`basename "$1" .tex`"

您需要先删除扩展,然后再重新插入。

答案2

这是一个很老的帖子,但值得在这里提供一个更通用、最简单的答案。

我从未使用过 TeXShop(手边没有 Mac),但以下内容在 Windows 和 Linux 上的 TeXworks 和 TeXmaker 中运行良好,在旧版本的 Winedt 中也运行良好。

解决方案有两个:

  1. 首先,请记住,TeX 提供非标准格式的“老式”方式是基于&(&) 键。这可以在命令行上使用,也可以作为 latex 文件的第一行,例如: %&"myCustonFormat" 请注意,%后面跟着的&充当传递给 (la)tex 的神奇注释,就像从命令行执行的操作一样。
  2. 其次,自定义格式的创建主要通过以下方式简化:mylatexformat.ltxTeX 程序 该程序通过命令行完成创建格式所需的全部工作:

    pdflateX -initialize -jobname="myCustonFormat" "&pdflatex" mylatexformat.ltx "mySourceFile.tex"
    

我习惯使用以每个项目自定义格式命名为主文件并使用:

pdflateX -initialize -jobname="myFile" "&pdflatex" mylatexformat.ltx "myFile.tex"

该命令可以配置为TeXworks中的排版工具,如下图所示:

TeXworks 配置 MakeCustom 格式

最终的 MWE 是:

%&"mwe"
% !TEX encoding = UTF-8
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{tikz}
\csname endofdump\endcsname
\setcounter{secnumdepth}{1}
\begin{document}
\section{First}
\subsection{subsection}
Lorem ipsum dolor sit amet, consectetur adipiscing elit...
\end{document}

在此代码中,我在序言中包含了 heavypgf/tikz包,以纳入自定义格式,而\setcounter{secnumdepth}{1}放置在 之后的\csname endofdump\endcsname不是包含在格式中,因此可以进行修改而无需重建自定义格式。第二行是 TeWworks 风格的魔法命令,仅由编辑器解释,而第一行则由 (pdf)(la)tex 编译器解释。

当然,使用上面显示的排版工具创建的格式将被称为mwe.fmt,但可以重命名。如果打算创建系统或用户范围的自定义格式,则值得使用一次命令行,从而提供更有意义的jobname格式名称。

相关内容