这是我试图通过这个问题来理解的一个真实的例子:
我正在重写我的简历,europecv
其中一种我不喜欢的行为是个人信息的标题:
假设我想Surename(s) / First name(s)
用一个简单的来替换Name
。europecv.cls
其中有以下几行:
\newcommand*{\ecvname}[1]{\def\ecv@name{#1}}
.
.
.
\ecv@namekey & \large\textbf{\ecv@name}\tabularnewline[5pt]
在一个名为的文件中ecven.def
有一个像这样的宏
\def\ecv@namekey{\ecv@utf{Surname(s) / First name(s)}}
我知道通过更改原始文件中的上述行我可以实现我想要的,但是我宁愿不弄乱原始类(而且我不确定这样是否很酷LPPL
)。这个答案说可以轻松地重新定义\def
,但是如果文档类已经在使用另一个定义,我应该在哪里执行此操作?
一般来说,重新定义 documentclass 宏的正确方法是什么,特别是这个例子?
为了方便您使用,以下是 MWE:
\documentclass[10pt,notitle,nologo,totpages]{europecv}
% How to acheive the line below?
% \def\ecv@namekey{\ecv@utf{Name}}
\ecvname{Pouya}
\ecvtelephone{+1234567890}
\ecvemail{[email protected]}
\begin{document}
\begin{europecv}
\ecvpersonalinfo
\ecvsection[-1cm]{Current position}
\ecvitem{}{In front of the computer}
\end{europecv}
\end{document}
答案1
由于您正在重新定义包含 的宏@
,因此您需要添加\makeatletter
和\makeatother
。有关此内容的更多信息,请参阅下面列出的参考资料。
\makeatletter
\def\ecv@namekey{\ecv@utf{Name}}
\makeatother
笔记:
代码:
\documentclass[10pt,notitle,nologo,totpages]{europecv}
% How to acheive the line below?
\makeatletter
\def\ecv@namekey{\ecv@utf{Name}}
\makeatother
\ecvname{Pouya}
\ecvtelephone{+1234567890}
\ecvemail{[email protected]}
\begin{document}
\begin{europecv}
\ecvpersonalinfo
\ecvsection[-1cm]{Current position}
\ecvitem{}{In front of the computer}
\end{europecv}
\end{document}
答案2
如果您只想为特定文档重新定义一个或两个命令,那么在序言中执行此操作可能是最直接的。如果命令包含@
,则需要特殊处理:
\documentclass[10pt,notitle,nologo,totpages]{europecv}
% How to acheive the line below?
% \def\ecv@namekey{\ecv@utf{Name}}
\makeatletter% because the line includes @ we nest the redefinition this way
\def\ecv@namekey{\ecv@utf{Name}}
\makeatother% make sure to return to normal before continuing
\ecvname{Pouya}
\ecvtelephone{+1234567890}
\ecvemail{[email protected]}
\begin{document}
\begin{europecv}
\ecvpersonalinfo
\ecvsection[-1cm]{Current position}
\ecvitem{}{In front of the computer}
\end{europecv}
\end{document}
如果您想要进行更广泛的更改,并将其用于许多文档中,最简单的方法是创建一个自定义包或类来将所有内容放在一起。具体细节取决于具体情况。
首先,如果您创建自定义配置文件,某些包和类将使用它。始终值得检查这一点,因为这通常是最简单、最可靠的自定义方式。但是,我通读了文档,europecv
发现在这种情况下这似乎不是一个选择。
其次,对于非常简单的情况,您可以只使用\input{myfile}
并保留自定义项myfile.tex
。例如:
\ProvidesFile{myfile}
% some stuff here
\makeatletter% because the line includes @ we nest the redefinition this way
\def\ecv@namekey{\ecv@utf{Name}}
\makeatother% make sure to return to normal before continuing
\endinput
\input{myfile}
然后在序言中使用。
第三,您可以将自定义项放入样式文件中 ( mystyle.sty
)。同样,也有不同的方法,例如:
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mystyle}
\RequirePackage{some package}
\def\ecv@namekey{\ecv@utf{Name}}% note - no need for \makeatletter... in this case.
% some stuff
第四,您可以编写一个自定义类 ( myclass.cls
),用特定选项加载原始类。这样做的主要原因是,在加载主类后无法进行所需的更改,因此样式文件将无法工作。有多种方法可以做到这一点,例如:
\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX)
[1994/12/01]% LaTeX date must December 1994 or later
\ProvidesClass{europecv-mine}
% stuff here
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{europecv}}
\ProcessOptions*
\LoadClass[10pt,notitle,nologo,totpages]{europecv}
\RequirePackage{some package}
% more stuff
\def\ecv@namekey{\ecv@utf{Name}}% note - no need for \makeatletter... in this case.
\endinput
最后,如果您想要进行非常广泛的更改,您可以将类或样式文件复制到新名称并进行修改。例如,您可以复制europecv.cls
到my-europecv.cls
并进行适当的修改。请注意,除非您更新修改后的代码,否则您将不会从主类的未来更新中受益。另一方面,这可能意味着您的自定义不太可能中断。
许可是一个法律问题,与本网站无关。因此我不会就您问题的这一方面发表评论。