代码在 .tex 文件中可以运行,但在 .cls 文件中执行时则不行

代码在 .tex 文件中可以运行,但在 .cls 文件中执行时则不行

几分钟前,我在努力解决在 tex 文件中进行计算的问题。我希望给出一个值,然后函数\vspace在进行一些数学运算后将该值作为其参数。我想要做的是,对于给定的值,获取x

\vspace{(x-1)0.6 cm}

我展示了我损坏的代码,它已按照以下方式修复

\documentclass[]{paper}
\usepackage{calc}

\makeatletter
\newcommand{\titlelines}[1]{\def\@TitleLines{#1}}
\titlelines{1}
\newlength{\mylength}
\setlength{\mylength}{(\@TitleLines cm-1cm)*\real{0.6}}
\makeatother


\title{text \\ \vspace*{\mylength} more text}

\begin{document}
\maketitle
\end{document}

当我编译此代码时,它运行完美。但是现在,我想将其放入我正在为主管处理的 .cls 文件中。在 .cls 文件中,我有这段代码,它也运行完美

\title{
\begin{center}
\fontsize{\@TitleSize}{\@TitleSpacing}
\usefont{T1}{\@TitleFont}{b}{n}
\color{\@TitleColor}
\selectfont
\shadowtext{\begin{tabular}{c}\@TheTitle\end{tabular}}
\vspace*{0.6cm}
\\
\end{center}
\@Abs
}

\renewcommand{\title}[1]{\def\@TheTitle{#1}}

这里\@TitleStuff只是标题的字体自定义。\@Abs是摘要。\vspace里面的函数\title{...}是我要处理的函数。当我插入代码片段时

\makeatletter
\newcommand{\titlelines}[1]{\def\@TitleLines{#1}}
\newlength{\mylength}
\setlength{\mylength}{(\@TitleLines cm-1cm)*\real{0.6}}
\makeatother

在位之前\title{},然后替换\vspace*{0.6cm}\vspace*{\mylength}使用此类编译的 .tex 文件会给我一个错误。它说\@TitleLines未定义。你知道是什么导致了这个错误吗?我知道发布整个 .cls 文件是不切实际的,但如果你猜出哪里出了问题,我会非常感激的。

答案1

看一下上面的类代码做了什么:

\newcommand{\titlelines}[1]{\def\@TitleLines{#1}}

\titlelines已定义。每次使用\titlelines都会(重新)定义\@TitleLines

\newlength{\mylength}

新的长度\mylength已定义。

\setlength{\mylength}{(\@TitleLines cm-1cm)*\real{0.6}}

\@TitleLines用于计算和设置 的值\mylength。但此时\titlelines尚未使用,因此\@TitleLines仍未定义。这也是与第一个代码的主要区别。您已经拥有

\titlelines{1}

在计算之前。的这种用法\titlelines已经定义了\@TitleLines

因此,上面的类代码的问题在于,\mylength不是在定义之后(重新)计算\@TitleLines,而是在定义之后\titlelines、调用之前计算\titlelines,因此没有定义\@TitleLines。您可以通过在\@TitleLines第一次使用之前定义一个默认值来解决这个问题\mylength每次重新定义之后\@TitleLines或每次使用之前进行(重新)计算\@TitleLines。因此您可以执行以下操作:

\newcommand{\titlelines}[1]{\def\@TitleLines{#1}}
\newlength{\mylength}
\newcommand*{\@TitleLines}{1}
\newcommand*{\title}{%
  \setlength{\mylength}{(\@TitleLines cm-1cm)*\real{0.6}}%
  \vspace{\mylength}%
}

或者

\newlength{\mylength}
\newcommand{\titlelines}[1]{%
  \def\@TitleLines{#1}%
  \setlength{\mylength}{(\@TitleLines cm-1cm)*\real{0.6}}%
}
\newcommand*{\@TitleLines}{1}

但我建议简单地消除宏并\mylength用长度替换辅助长度\@TitleLines

\newlength{\@TitleLines}
\newcommand*{\titlelines}[1]{%
  \setlength{\@TitleLines}{0.6cm*(#1-1)}%
}

因此,您可以再次使用\vspace{\@TitleLines}而不是\vspace{\mylength}。如果添加\dimexpr到计算中,甚至不需要包calc

\newlength{\@TitleLines}
\newcommand*{\titlelines}[1]{%
  \setlength{\@TitleLines}{\dimexpr 0.6cm*(#1-1)\relax}%
}

或者,您仍然可以使用宏\@TitleLines并将的用法移动\dimexpr到的用法\vspace

\newcommand*{\@TitleLines}{1}
\newcommand*{\titlelines}[1]{\renewcommand*{\@TitleLines}{#1}}
\newcommand*{\title}{%
   \vspace{\dimexpr 0.6cm*(\@TitleLines-1)\relax}
}

相关内容