几分钟前,我在努力解决在 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}
…
}