我的文档的基本字体大小是 12pt,但我希望图形的排版好像基本字体大小是 10pt(有些图形使用图形包来硬连接字体大小命令而不是提供\foosize
间接寻址,所以我不能只用这种方式来修复它)。
我已经发现本地切换不同的字体大小,所以我的目标是把它包装起来\newenvironment
。 编辑:它并不像使用那么简单如何创建一个宏,当定义宏时,该宏可以读取文件的内容?,但我现在有这个:
\usepackage{catchfile}
\CatchFileDef{\tenpointdecl}{size10.clo}{\makeatletter}
\newenvironment{fontsizeten}{%
\let\saveendinput\endinput
\let\endinput\relax
\let\savenewcommand\newcommand
\let\newcommand\renewcommand
\tenpointdecl
\let\newcommand\savenewcommand
\let\endinput\saveendinput
}{}
\tenpointdecl
这可行,但我觉得不够优雅。如果有办法重写 的内容,这样\let
每次调用时就不需要 s 了,那就更好了。有什么建议吗?
答案1
\endinput
除了重新定义之外,还必须避免阅读\newcommand
:
\documentclass[a4paper,12pt]{article}
\usepackage{catchfile,lipsum}
\makeatletter
\let\clo@newcommand\newcommand
\let\clo@endinput\endinput
\CatchFileDef{\clo@sizeten}{size10.clo}{}
\newenvironment{fontsizeten}
{\par % go in vertical mode
\let\endinput\relax % neutralize \endinput
\let\newcommand\renewcommand % the commands are already defined
\clo@sizeten % "read" the file
\let\endinput\clo@endinput % revert to the original command
\let\newcommand\clo@newcommand % revert to the original command
}
{\par}
\makeatother
\begin{document}
\lipsum[1-2]
\begin{fontsizeten}
\lipsum[1-2]
\end{fontsizeten}
\lipsum[1-2]
\end{document}
照常,利普萨姆仅用于创建虚拟文本。在执行的重新定义后,\newcommand
和的原始含义\endinput
应立即恢复。size10.clo
答案2
我会考虑每次都重新读取文件。只要你不经常切换,这不会降低效率。
无论如何,您可以使用catchfile
软件包。它需要 e-TeX,可以避免您遇到的问题。另请参阅如何创建一个宏,当定义宏时,该宏可以读取文件的内容?。
您看到的问题是 TeX 的\input
(在 LaTeX 中)在(或全局)\@@input
中不起作用,因为据我所知,TeX 在宏定义期间遇到文件结尾时会认为这是一个错误。另外,您不应该使用或,因为这不仅会扩展,还会扩展其内容。您不希望这样!您需要改用,但由于上述原因,这也不起作用。\edef
\xdef
\edef
\xdef
\@@input
\expandafter