有没有办法定义名称包含(几乎)任意字符的 TeX 命令,例如:
、-
、_
、 数字等,甚至空格?除了标准字母外,这些是我需要的字符,但当然,如果它可以支持更多字符,那就不会有坏处了。
我想要的是一个类似于\newmycommand
以下代码的命令。最好,它也可以在序言之外使用。我不需要它定义的命令来支持参数,但如果它不会让一切变得更加困难,我建议您将它包含在答案中,以便其他可能需要它的人使用。
\documentclass{memoir}
\def\newmycommand#1#2{%define a new command as #1 with code #2
}
\def\usemycommand#1{%apply command #1
}
\newmycommand{my-first-command:day-one}{Day one is a great day}%defines the command "my-first-command:day-one" to be the text "Day one is a great day"
\begin{document}
\usemycommand{my-first-command:day-one}%use the command defined above
\newmycommand{my-second-command}{Last command}%define another command inside the document
\usemycommand{my-second-command}%use this command
\end{document}
答案1
您可以通过提供别名来使用\@namedef
和\@nameuse
;但这不会捕获错误。
\newcommand
以下是和的模拟\renewcommand
(无*
版本):
\newcommand{\newlcommand}[1]{\expandafter\newcommand\csname#1\endcsname}
\newcommand{\renewlcommand}[1]{\expandafter\renewcommand\csname#1\endcsname}
\makeatletter
\newcommand{\uselcommand}[1]{%
\ifcsname#1\endcsname
\@latex@error{Undefined control sequence}
{The control sequence at the end of the top line\MessageBreak
of your error message was never \string\def'ed.}%
\else
\csname#1\expandafter\endcsname
\fi
}
\makeatother
完整示例
\documentclass{article}
\newcommand{\newlcommand}[1]{\expandafter\newcommand\csname#1\endcsname}
\newcommand{\renewlcommand}[1]{\expandafter\renewcommand\csname#1\endcsname}
\makeatletter
\newcommand{\uselcommand}[1]{%
\ifcsname#1\endcsname
\csname#1\expandafter\endcsname
\else
\@latex@error{Undefined control sequence}
{The control sequence at the end of the top line\MessageBreak
of your error message was never \string\def'ed.}%
\fi
}
\makeatother
\newlcommand{my-first-command:day-one}{Day one is a great day}
\newlcommand{my-second-command}[1]{Last command called with #1}
\newlcommand{my-second-command}{whatever}% ERROR
\begin{document}
\uselcommand{my-first-command:day-one}
\uselcommand{my-second-command}{``Hello''}
\uselcommand{joiewo--:}% ERROR
\end{document}
看\csname 和 \endcsname 到底起什么作用?了解允许使用哪些字符。
对于条件语句你可以这样做:
\newcommand{\newlif}[1]{\expandafter\newif\csname if#1\endcsname}
\newcommand\lcond[1]{T\expandafter T\expandafter\fi\csname if#1\endcsname}
\newcommand\ltrue[1]{\csname#1true\endcsname}
\newcommand\lfalse[1]{\csname#1false\endcsname}
这是一个测试
\newlif{my-if} % starts out false
\if\lcond{my-if}%
true
\else
false
\fi
\ltrue{my-if} % change the truth value
\if\lcond{my-if}%
true
\else
false
\fi
您可以在和\global
前面使用。\ltrue
\lfalse