我遇到了一些代码问题,需要一些帮助。我已经使用这个实现很长时间了,之前没有遇到过任何问题。
这是我存储所有变量的方式
\newcommand{\@srulesI}{}
\newcommand{\@srulesII}{}
\newcommand{\srules}[2]{
\renewcommand\@srulesI{#1}
\renewcommand\@srulesII{#2}}%%%%%
这是它的逻辑。
\if\@srulesII\@emptymacro
\else
\begin{minipage}{\linewidth}
\raggedright
{\bfseries \rule{0em}{1.5em}\@srulesI}
\@srulesII
\end{minipage}
\fi
这些代码有效
\srules{}{}%%%%%
\srules{}{asdf}%%%%%
\srules{asdf}{}%%%%%
\srules{asdf}{asdf}%%%%%
\srules{asdf}{asdf\rule{0.5in}{0.5in}}%%%%%
这段代码不起作用,恰好是我需要的。
\srules{asdf}{\rule{0.5in}{0.5in}}%%%%%
它给出了一个错误“不完整 \if;第 40 行后的所有文本都被忽略。”
有人知道为什么吗?我不知道为什么这\rule
会让编译器不适应。
第二个问题。我的做法真的是声明和存储变量的最佳方式吗?因为我有大约 50 个变量,而且我的.cls
文件越来越大。
答案1
对于宏观比较,使用\ifx
,而不是\if
:
\documentclass{article}
\makeatletter
\newcommand{\@srulesI}{}
\newcommand{\@srulesII}{}
\newcommand{\srules}[2]{
\renewcommand\@srulesI{#1}
\renewcommand\@srulesII{#2}}%%%%%
\newcommand{\@emptymacro}{}
\makeatother
\begin{document}
\srules{asdf}{\rule{0.5in}{0.5in}}%%%%%
\makeatletter
\ifx\@srulesII\@emptymacro
\else
\begin{minipage}{\linewidth}
\raggedright
{\bfseries \rule{0em}{1.5em}\@srulesI}
\@srulesII
\end{minipage}
\fi
\makeatother
\end{document}
回答你的第二个问题,这实际上取决于你的用户界面。请注意,宏的参数限制为 9 个,尽管可以增加. 在这种情况下,通常首选键值接口。