如何正确的修改文档类的某些行为?

如何正确的修改文档类的某些行为?

这是我试图通过这个问题来理解的一个真实的例子:

我正在重写我的简历,europecv其中一种我不喜欢的行为是个人信息的标题:

在此处输入图片描述

假设我想Surename(s) / First name(s)用一个简单的来替换Nameeuropecv.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.clsmy-europecv.cls并进行适当的修改。请注意,除非您更新修改后的代码,否则您将不会从主类的未来更新中受益。另一方面,这可能意味着您的自定义不太可能中断。

许可是一个法律问题,与本网站无关。因此我不会就您问题的这一方面发表评论。

相关内容