![如何避免在 Tikz 环境中将 # 字符转义为命令参数?](https://linux22.com/image/388268/%E5%A6%82%E4%BD%95%E9%81%BF%E5%85%8D%E5%9C%A8%20Tikz%20%E7%8E%AF%E5%A2%83%E4%B8%AD%E5%B0%86%20%23%20%E5%AD%97%E7%AC%A6%E8%BD%AC%E4%B9%89%E4%B8%BA%E5%91%BD%E4%BB%A4%E5%8F%82%E6%95%B0%EF%BC%9F.png)
我正在尝试编写一个与音乐相关的包,用户可以在其中输入和弦名称,然后可以很好地打印出来:
% 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\#
后你的生活会变得更好。