如何在 .tex 文件内部执行计算以便在函数中使用该值?

如何在 .tex 文件内部执行计算以便在函数中使用该值?

我正在尝试根据从键盘读取的函数提供的值来设置 \vspace{} 内使用的值。例如,如果提供的值为 3,我希望 \vspace{} 为

\vspace{(3-1)0.6 cm}

我尝试过但没有成功

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

\newcommand{\titlelines}[1]{\def\@TitleLines{#1}}
\titlelines{3}
\newlength{\mylength}
\setlength{\mylength}{{\@TitleLines-1}*0.6}


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

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

我不知道我做错了什么。你能帮我修复这个代码吗?非常感谢。

答案1

您的代码存在一些问题,其中一个是看不见的。由于您没有使用\makeatletter,因此您的定义\titlelines使\@变成了一个宏,它会吞噬TitleLines并吐出一些数字。由于您始终遵循\@TitleLines因此这不会导致错误。

您应该calc使用括号而不是大括号来括住子表达式。此外,所有维度都需要一个单位。还calc要求在命令中包装十进制数\real

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

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


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

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

答案2

@首先,由于宏中有一个符号\@TitleLines,因此必须将使用此宏的代码放在\makeatletter和之间\makeatother(除非它在类或包文件中)。但是,我建议使用不带的宏@

其次,该calc包只允许长度相乘长度:\setlength{\mylength}{0.6cm * (\@TitleLines-1)}

第三,表达式中必须使用圆括号。

所以代码变成:

\documentclass[]{paper}
\usepackage{calc}
\makeatletter
\newcommand{\titlelines}[1]{\def\@TitleLines{#1}}
\titlelines{3}
\newlength{\mylength}
\setlength{\mylength}{0.6cm * (\@TitleLines-1)}
\makeatother

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

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

答案3

我没有尝试修复您的尝试,而是尝试以另一种方式回答隐含的问题。这通过在编译命令行上定义您想要的长度来实现。不需要makeatletter。它可能与您的工作流程匹配,也可能不匹配。

如果输入文件是cmddef.tex 编译用的

pdflatex "\def\mylength{3 cm} \input{cmddef.tex}"

cmddef.tex:

\documentclass{paper}
%\newcommand{\mylength}{3 cm}

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

\begin{document}
\maketitle

The value of mylength is \mylength{}.
\end{document}

(发现于向文档传递参数

相关内容