我想重新定义\item[]
以使其工作如下:
\documentclass[fontsize=22pt]{scrreprt}
\UsePackage[inline]{enumitem}
\newlist{notes}{description}{1}
\setlist[notes]{
leftmargin=0.3\linewidth,labelsep=2em,
itemsep=1.5ex,style=multiline,font=\normalfont
}
\def\removespecial{
\catcode`\_=12
\catcode`\^=12
\catcode`\$=12
\catcode`\%=12
\catcode`\#=12
\catcode`\&=12
\catcode`\~=12
}
\begin{document}
\begin{notes}
\item[something]
{\removespecial\obeylines\obeyspaces
...some content...
}
\end{notes}
\end{document}
也就是说,将后面的内容括\item[]
在括号中,以便我可以\obeylines
在里面使用等。如果没有括号,像这样的宏\obeylines
会影响文档的其余部分并破坏其他一些命令。但是,虽然手动添加括号是可行的,但我不知道如何在宏中做到这一点(通过重新定义\item[]
或其他方式)。有人能告诉我怎么做吗?
答案1
我没有对此进行广泛的测试,因为我不确定您的用例,并且您的 MWE 没有提供太多线索。不过,我相当有信心它可以按您的要求工作,因为下面的 MWE 会产生:
特别要注意间距、换行符和特殊字符是否符合您的要求。此外,根据上述评论,我检查了您的注释\remove@special
在注释环境关闭后不再有效,这很好。
\item
这个想法是在环境中重新定义notes
,以便将您的特殊 cat 代码和 插入到块\obey*
中\bgroup...\egroup
。第一个\item
启动该组,下一个关闭最后一个组(使用\endLastItem
),然后启动下一个\item
-group。唯一的问题是,在环境结束时,notes
我们仍然需要关闭最后一个 的“特殊组” \item
。这是通过将notes
环境嵌入另一个环境来完成的,该环境在 结束时负责处理这个问题。所以下面的例子实际上出现在环境内部Notes
。
代码如下:
\documentclass[fontsize=22pt]{scrreprt}
\usepackage[inline]{enumitem}
\newlist{notes}{description}{1}
\setlist[notes]{
leftmargin=0.3\linewidth,labelsep=2em,
itemsep=1.5ex,style=multiline,font=\normalfont
}
\makeatletter
\def\remove@special{
\catcode`\_=12
\catcode`\^=12
\catcode`\$=12
\catcode`\%=12
\catcode`\#=12
\catcode`\&=12
\catcode`\~=12
}
\let\realItem=\item
\let\endLastItem=\relax
\newcommand\specialItem[1][\relax]{\endLastItem%
\ifx\relax#1\relax\realItem\else\realItem[#1]\fi%i
\bgroup\remove@special\obeylines\obeyspaces
\let\endLastItem\egroup}
\newenvironment{Notes}{\notes\let\item\specialItem}{\endLastItem\endnotes}
\makeatother
\begin{document}
\begin{Notes}
\item[something]
\item Another item with some
special commands # _ $ % & ~
\end{Notes}
\end{document}