我正在尝试根据从键盘读取的函数提供的值来设置 \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}
(发现于向文档传递参数)