在格式中设置后更改字体大小类选项

在格式中设置后更改字体大小类选项

我用来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用替换每次出现的。我使用将文件读取到宏的包()然后将其读取()。请注意,循环是必要的,因为仅替换第一次出现的。\renewcommandsize11.clocatchfilesize11.clo\patchcmdetoolbox\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}

相关内容