我用来mylatexformat
轻松构建格式文件。考虑以下文件
\documentclass[10pt]{article}
% This is file t.tex
\begin{document}
Test
\end{document}
然后我运行pdflatex -ini -jobname="myfmt" "&pdflatex" mylatexformat.ltx """t.tex"""
以获取myfmt.fmt
。Fontsize 现在已硬编码myfmt.fmt
并设置为10pt
。
现在,我有另一个文件:
%&myfmt
\documentclass{NoMatterItIsNotReadAnyway}
% This is s.tex
\begin{document}
Test
\end{document}
当我编译它时,会使用格式myfmt.fmt
并将字体大小设置为10pt
。现在,我想将其设置为11pt
。据我所知,与字体大小相关的定义是在size1?.clo
文件中设置的。所以我想我可以这样做
%&myfmt
\documentclass{NoMatterItIsNotReadAnyway}
\csname endofdump\endcsname % See mylatexformat documentation
\makeatletter
\input{size11.clo}
\makeatother
\begin{document}
Test
\end{document}
不幸的是,它不起作用,因为一些宏已经定义,\newcommand
检查机制拒绝进一步操作。有办法绕过这个问题吗?
答案1
这有点黑客行为,但希望它不会破坏任何东西。
%&myfmt
\documentclass{NoMatterItIsNotReadAnyway}
\csname endofdump\endcsname % See mylatexformat documentation
\makeatletter
% Save orginal definition of \new@command
\let\Oldnew@command\new@command
% Based on \renew@command definition.
% Basically make \newcommand behave like \renewcommand
\def\new@command#1{%
\let\@ifdefinable\@rc@ifdefinable
\@testopt{\@newcommand#1}0}
\input{size11.clo}
\let\new@command\Oldnew@command
\makeatother
\begin{document}
Test
\end{document}
实现相同目标的另一种方法是读取时\newcommand
用替换每次出现的。我使用将文件读取到宏的包()然后将其读取()。请注意,循环是必要的,因为仅替换第一次出现的。\renewcommand
size11.clo
catchfile
size11.clo
\patchcmd
etoolbox
\patchcms
\newcommand
%&myfmt
\documentclass{NoMatterItIsNotReadAnyway}
\csname endofdump\endcsname % See mylatexformat documentation
\makeatletter
\usepackage{etoolbox,catchfile}
\CatchFileDef\content{size11.clo}\relax
\newif\ifendofpatch
\endofpatchfalse
\@whilesw\unless\ifendofpatch\fi{%
\patchcmd{\content}{\newcommand}{\renewcommand}{\endofpatchfalse}{\endofpatchtrue}}
\makeatother
\begin{document}
Test
\end{document}