我有这个MWE:
\documentclass[11pt]{article}
\usepackage{amsmath}
\RequirePackage[colorlinks=true
,urlcolor=blue
,anchorcolor=blue
,citecolor=blue
,filecolor=blue
,linkcolor=blue
,menucolor=blue
,linktocpage=true
,pdfproducer=medialab
,pdfa=true
]{hyperref}
\usepackage[poorman,capitalize,english]{cleveref}
\pagestyle{empty}
\begin{document}
\section{First section\label{sec:01}}
Text \cref{eq:01} in \cref{sec:01}:
\begin{equation}
\label{eq:01}
x+y=z
\end{equation}
\end{document}
当我运行时,pdflatex MWE.tex
我会得到MWE.sed
文件,但如果我运行:
sed -f MWE.sed MWE.tex > unclevereffedMWE.tex
我得到:
\documentclass[11pt]{article}
\usepackage{amsmath}
\RequirePackage[colorlinks=true
,urlcolor=blue
,anchorcolor=blue
,citecolor=blue
,filecolor=blue
,linkcolor=blue
,menucolor=blue
,linktocpage=true
,pdfproducer=medialab
,pdfa=true
]{hyperref}
\pagestyle{empty}
\begin{document}
\section{First section\label{sec:01}}
Text \cref{eq:01} in \cref{sec:01}:
\begin{equation}
\label{eq:01}
x+y=z
\end{equation}
\end{document}
如果我删除该hyperref
包,它就可以正常工作。现在,我试图在.sed
不删除hyperref
包的情况下“强制”生成工作文件。我试过:
\documentclass[11pt]{article}
\usepackage{amsmath}
\makeatletter
\@namedef{[email protected]}{}
\makeatother
\RequirePackage[colorlinks=true
,urlcolor=blue
,anchorcolor=blue
,citecolor=blue
,filecolor=blue
,linkcolor=blue
,menucolor=blue
,linktocpage=true
,pdfproducer=medialab
,pdfa=true
]{hyperref}
\usepackage[poorman,capitalize,english]{cleveref}
\pagestyle{empty}
\begin{document}
\section{First section\label{sec:01}}
Text \cref{eq:01} in \cref{sec:01}:
\begin{equation}
\label{eq:01}
x+y=z
\end{equation}
\end{document}
但它不起作用。我想我需要欺骗这个选项:
\@ifpackageloaded{hyperref}
在cleveref.sty
。这可能吗?我做错了吗?
笔记。请记住,我的最终目标是在.sed
不修改原始MWE.tex
文件的情况下“强制”生成文件。
我的目标是将外部重新定义/选项传递给引擎pdflatex
。例如:
pdflatex "\AtBeginDocument{OPTIONS} \input{MWE.tex}"
在此阶段我不关心警告或布局。
答案1
让我们来看看我的 MWE,其中我从包的选项中删除了该poorman
选项:cleveref
\documentclass[11pt]{article}
\usepackage{amsmath}
\RequirePackage[colorlinks=true
,urlcolor=blue
,anchorcolor=blue
,citecolor=blue
,filecolor=blue
,linkcolor=blue
,menucolor=blue
,linktocpage=true
,pdfproducer=medialab
,pdfa=true
]{hyperref}
\usepackage[capitalize,english]{cleveref}
\pagestyle{empty}
\begin{document}
\section{First section\label{sec:01}}
Text \cref{eq:01} in \cref{sec:01}:
\begin{equation}
\label{eq:01}
x+y=z
\end{equation}
\end{document}
我可以使用以下命令生成 MWE.sed 文件:
latexmk -pdf -usepretex='\PassOptionsToPackage{poorman}{cleveref}\makeatletter\disable@package@load{hyperref}{}\makeatother' -pdflatex='touch %D; pdflatex -draftmode %O %P' MWE.tex
我用:
latexmk -pdf
调用pdflatex
并编译文件正确的次数。
-usepretex='\PassOptionsToPackage{poorman}{cleveref}
将poorman
选项传递给cleveref
包。
\makeatletter\disable@package@load{hyperref}{}\makeatother'
hyperref
按照建议禁用该包乌尔丽克·菲舍尔。
-pdflatex='touch %D; pdflatex -draftmode %O %P' MWE.tex
以避免生成该MWE.pdf
文件。
现在我可以使用:
sed -f MWE.sed MWE.tex > unclevereffedMWE.tex
在我的实际情况中我将使用这个命令:
latexmk -pdf -usepretex='\PassOptionsToPackage{poorman}{cleveref} \makeatletter\disable@package@load{hyperref}{}\makeatother \let\href\empty\let\url\empty\let\texorpdfstring\empty' -pdflatex='touch %D; pdflatex -draftmode %O %P' -output-directory=/tmp -jobname=uncleveref MWE.tex
添加:
\let\href\empty\let\url\empty\let\texorpdfstring\empty
以及选项:
-output-directory=/tmp -jobname=uncleveref
生成文件/tmp/uncleveref.sed
。
我将使用该uncleveref.sed
文件准备一个Emacs
交互式函数来执行替换。
答案2
冲突是因为 hyperref 向 cleveref 未预料到的 .aux 文件写入了内容。以下方法似乎可以解决这个问题:
\documentclass[11pt]{article}
\usepackage{amsmath}
%\usepackage[colorlinks=true
% ,urlcolor=blue
% ,anchorcolor=blue
% ,citecolor=blue
% ,filecolor=blue
% ,linkcolor=blue
% ,menucolor=blue
% ,linktocpage=true
% ,pdfproducer=medialab
% ,pdfa=true
%]{hyperref}
\usepackage[poorman,capitalize,english]{cleveref}
\pagestyle{empty}
\begin{document}
\section{First section\label{sec:01}}
Text \cref{eq:01} in \cref{sec:01}:
\begin{equation}
\label{eq:01}
x+y=z
\end{equation}
\end{document}
现在运行 sed:
sed -f MWE.sed MWE.tex > MWE_unclever.tex
现在编辑“unclever”文件并取消注释hyperref部分,它就应该正常工作。