我定义了一个简单的 LaTeX 宏\bansen
,它接受一个参数:
\newcommand{\bansen}[1]{#1}
不幸的是,我注意到我不能使用bytefield
环境作为这个宏的参数,就像
\documentclass{article}
\usepackage{bytefield}
\newcommand{\bansen}[1]{#1} \usepackage{bytefield}
\begin{document}
\bansen{
\begin{bytefield}{16}
\wordbox{1}{A 16-bit field}\\
\bitbox{8}{8 bits} & \bitbox{8}{8 more bits}
\end{bytefield}
}
\end{document}
因为这会在宏的右括号处产生错误}
:
! Extra alignment tab has been changed to \cr.
<template> \endtemplate
l.11 }
显然是由&
角色引入的——将那句台词替换为
\bitbox{8}{8 bits} % & \bitbox{8}{8 more bits}
让错误与该行的第二列一起消失。
谁能告诉我出了什么问题以及如何解决这个问题?
动机:我的真实宏\bansen
包含其他几个排版命令和更多参数。使用该宏的 LaTeX 代码是计算机生成的,这使我能够将内容(生成器)和形式(LaTeX 样式)分开,因此我不太喜欢不使用宏的想法。
答案1
出于其内部目的,在启动环境时bytefield
更改的类别代码。此更改不能影响已被吸收的参数,因此您必须事先进行类别更改:&
\bansen
\documentclass{article}
\usepackage{bytefield}
\newcommand{\bansen}{%
\begingroup\catcode`&=10
\banseninternal}
\newcommand{\banseninternal}[1]{%
#1%
\endgroup
}
\begin{document}
\begin{bytefield}{16}
\wordbox{1}{A 16-bit field}\\
\bitbox{8}{8 bits} & \bitbox{8}{8 more bits}
\end{bytefield}
\bigskip
\bansen{%
\begin{bytefield}{16}
\wordbox{1}{A 16-bit field}\\
\bitbox{8}{8 bits} & \bitbox{8}{8 more bits}
\end{bytefield}%
}
\end{document}
补充格式说明将\banseninternal
代替\bansen
。