如何避免在 Tikz 环境中将 # 字符转义为命令参数?

如何避免在 Tikz 环境中将 # 字符转义为命令参数?

我正在尝试编写一个与音乐相关的包,用户可以在其中输入和弦名称,然后可以很好地打印出来:

% this prints out the C chord
\somecommand{C}

但是,和弦名称可以有升号和降号,我希望 UI 尽可能简单。基本上,避免用户必须转义字符#,因此他可以这样写:

\somecommand{C#}

而不是这样:

\somecommand{C\#}

这个答案,我读到这可以通过以下方式完成:

\catcode`#=12

因此,这确实有效:

\documentclass{article}
\newcommand{\mycommand}[1]
{
   chord=#1
}    
\catcode`#=12   
\begin{document}
\mycommand{G#}
\end{document}

并打印“chord=G#”。

但是,我无法在真实情况下使这个技巧发挥作用,因为所有这些实际上都嵌入在 Tikz 环境中:

\documentclass{article}
\usepackage{tikz}

\newenvironment{myenv}
{
    \newcommand{\mycommand}[1]
    {
    \draw(0,0) node {chord=##1};
    }
    \begin{tikzpicture}
}
{
    \end{tikzpicture}
}  

\catcode`#=12

\begin{document}
\begin{myenv}
\mycommand{G#}
\end{myenv}
\end{document}

这个 MCVE 产生了许多我无法理解的错误:

ABD: EveryShipout initializing macros
(/usr/local/texlive/2017/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
[Loading MPS to PDF converter (version 2006.09.02).]
! Use of \@@mptopdf@@newabove doesn't match its definition.
l.136     \@@mptopdf@@newabove \csname n
                                        ewcount\endcsname \scratchcounter
If you say, e.g., `\def\a1{...}', then you must always
put `1' after `\a', since control sequence names are
made up of letters only. The macro here has not been
followed by the required stuff, so I'm ignoring it.

! Extra \endcsname.
l.136 ...opdf@@newabove \csname newcount\endcsname
...

问题:

  • 有办法解决这个问题吗?怎么解决?
  • 或者我走错了路?还有其他方法可以实现此目标吗?

答案1

延时设置:

\documentclass{article}
\usepackage{tikz}

\newenvironment{myenv}
 {%
  \newcommand{\mycommand}[1]
    {%
    \draw(0,0) node {chord=##1};
    }%
    \begin{tikzpicture}
 }
 {%
    \end{tikzpicture}%
 }  

\AtBeginDocument{\catcode`#=12 }

\begin{document}
\begin{myenv}
\mycommand{G#}
\end{myenv}
\end{document}

尽管如此,这还是个坏主意。使用G\#后你的生活会变得更好。

答案2

\documentclass{article}
\usepackage{tikz}

   \newcommand{\mycommand}[1]
    {
      \draw(0,0) node {chord=#1};
    }

\newenvironment{myenv}
{
 \catcode`\#=12
 \begin{tikzpicture}
}
{
 \end{tikzpicture}
}



\begin{document}
\begin{myenv}
\mycommand{G#}
\end{myenv}
\end{document}

在此处输入图片描述

相关内容