带有半任意字符的命令

带有半任意字符的命令

有没有办法定义名称包含(几乎)任意字符的 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

相关内容