背景:
正如我之前的问题一样,如果在预编译的 .fmt 文件中使用,则无法获取真正的 currfile,我试图通过生成文件来加快编译速度.fmt
。下面的示例测试将标记的值\MyToken
设置为两个破折号之间的文件名部分。
我是不是当我使用时获得所需的行为TeXShop
和预编译.fmt
文件。但是,如果我使用 或命令行编译,一切就会按预期进行。我怀疑调用的脚本TeXworks
有些不对劲,但不确定。MyLaTeX.engine
TeXShop
保存MyPreamble.tex
如下定义后,我首先通过命令行编译前言:
pdflatex -ini -jobname=MyPreamble "&pdflatex MyPreamble.tex\dump"
然后我尝试用四种不同的方式来处理这个序言foo-x-bar.tex
:
命令行编译(作品):
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
使用 TeXworks (作品):
配置
MyLaTeX
为我得到与命令行编译相同的结果(同样,没有红色错误消息)。
使用
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
,我收到可怕的红色错误消息:编译
foo-x-barComplete.tex
,非常简单:\input{MyPreamble.tex} \input{foo-x-bar.tex}
直接通过
LaTeX
,TeXShop
然后pfdlatex
,TeXworks
一切也运行正常(没有红色错误消息)。
因此,问题仅有的发生于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 中也运行良好。
解决方案有两个:
- 首先,请记住,TeX 提供非标准格式的“老式”方式是基于
&
(&) 键。这可以在命令行上使用,也可以作为 latex 文件的第一行,例如:%&"myCustonFormat"
请注意,%
后面跟着的&
充当传递给 (la)tex 的神奇注释,就像从命令行执行的操作一样。 其次,自定义格式的创建主要通过以下方式简化:
mylatexformat.ltx
TeX 程序 该程序通过命令行完成创建格式所需的全部工作:pdflateX -initialize -jobname="myCustonFormat" "&pdflatex" mylatexformat.ltx "mySourceFile.tex"
我习惯使用以每个项目自定义格式命名为主文件并使用:
pdflateX -initialize -jobname="myFile" "&pdflatex" mylatexformat.ltx "myFile.tex"
该命令可以配置为TeXworks中的排版工具,如下图所示:
最终的 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
格式名称。