我尝试在序言中定义一些变量,以便在那里初始化它们,然后打印在正文中。这是我尝试的
\documentclass[a4paper,11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[frenchb]{babel}
\newcommand{\cost}[1]{\def\@cost{#1}}
\newcommand{\refArticle}[1]{\def\@refArticle{#1}}
\cost{400}
\refArticle{TOTO01}
\begin{document}
This is a non-working test; it will cost \@cost dollars to buy \@refArticle.
\end{document}
它不起作用。我收到错误
! Use of \@ doesn't match its definition.
这让我很烦,因为
\documentclass[a4paper,11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[frenchb]{babel}
\newcommand{\cost}[1]{\def\@cost{#1}}
\newcommand{\refArticle}[1]{\def\@refArticle{#1}}
\cost{400}
% \refArticle{TOTO01}
\begin{document}
This is a working test; it will cost \@cost to buy what you want.
\end{document}
作品。
我可能遗漏了变量定义中的一些内容。您知道我的方法可能存在什么问题吗?
答案1
变量的形式\@cost
为“内部”,其中@
已定义为字母。
在您的文档正文中,@
被定义为“其他”,并且该命令\@
具有完全不同的含义,与您尝试执行的操作不兼容。
你可能这样做:
\makeatletter
\newcommand{\@cost}[1]{\def\cost{#1}}
\@cost{400}
\makeatother
\begin{document}
This is a working test; it will cost \cost\ to buy what you want.
还要注意后面的“斜线空格” \cost
。这(或另一个保留空间的机制)是必要的,以防止成本值进入“to”。
编辑:注意大卫卡莱尔的评论——在这种情况下,最好完全避免使用@
这些命令;两者都容易在文档正文中使用,@
除了极少数预定义的情况外,您确实需要避免使用这些命令。(有关此信息,请参阅任何好的乳胶手册。)