主题句的 LaTeX 宏(方括号“[”和“]”活动字符 catcode)

主题句的 LaTeX 宏(方括号“[”和“]”活动字符 catcode)

在撰写文档时,我通常会在方括号之间写上“主题句”(即大纲句),如下所示:

[这是下一段的中心思想]

在这里,我写了一个经过润色且写得很好的主题句版本。

我希望将方括号之间的任何文本放入草稿环境中:

[foo 栏]

应该成为

\begin{draft}
    foo bar
\end{draft}

我遇到的问题是如何使“[”和“]”成为活动字符。

我知道方括号通常用于参数,并且在读取命令(即\begin[args]{something})后,编译器会查找 catcode 11 个字符,如果是括号,则会读取参数。

将“[”或“]”的 catcode 更改为 active(或 catcode 13)将会破坏这一点。

有什么办法可以解决这个问题吗?也许甚至可以将正则表达式与 latex3 一起使用?

谢谢。

答案1

如果我正确理解了你的帖子,你正在寻求转换实例

[ topic sentence here ]

\begin{draft} topic sentence here \end{draft}

环境可以通过以下draft方式定义

\newenvironment{draft}{\color{gray}}{}

此外,我假设主题句,在输入文件中,它们各自位于一行中。换句话说,我会假设包含主题句的一行以 开头[并以 结尾]。这些假设意味着[...]

\setmainfont{...}[...]

不是主题句,因此不应转换为\begin{draft}...\end{draft}

如果这些假设有效,那么以下基于 LuaLaTeX 的解决方案可能会引起您的兴趣。

在此处输入图片描述

% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{geometry}
\usepackage{xcolor}
\newenvironment{draft}{\color{gray}}{} % per the OP's write-up

\usepackage{luacode}
\begin{luacode}
function convert_topic_sentences ( s )
  if s:find ( "^%[.+%]$" ) then -- found a topic sentence line
    return ( "\\begin{draft}"..s:sub(2,-2).."\\end{draft}" )
  end
end
\end{luacode}

% LaTeX macro to 'activate' the Lua function by assigning it to
% LuaTeX's "process_input_buffer" callback, where it acts as a 
% pre-processor.
\newcommand\TSOn{\directlua{luatexbase.add_to_callback ( 
  "process_input_buffer" , convert_topic_sentences , "TSON" )}}
\newcommand\TSOff{\directlua{luatexbase.remove_from_callback ( 
  "process_input_buffer" , "TSON" )}}

\begin{document}
\TSOn % activate the Lua function
Hello.
[A topic sentence.]
[A somewhat longer topic sentence.]
Not a topic sentence.

\TSOff % deactivate the Lua function
\smallskip
Hello.
[A topic sentence.]
[A somewhat longer topic sentence.]
Not a topic sentence.
\end{document}

答案2

在此处输入图片描述

这样做可能会破坏某些东西,并且有额外的限制,即必须开始一个段落(注意与 Mico 的例子相比[后面有一个空白行)。Hello

但如果 Lua 不可用...

\documentclass{article}
\usepackage{geometry}
\usepackage{xcolor}
\newenvironment{draft}{\par\color{gray}}{\par} % per the OP's write-up



\makeatletter
\def\TSOn{\everypar{\dodraft}}
\def\TSOff{\everypar{}}

\def\dodraft{\@ifnextchar[\dodraft@{}}
\def\dodraft@[#1]{\begin{draft}#1\end{draft}}

\makeatother

\begin{document}
\TSOn % activate the Lua function
Hello.

[A topic sentence.]
[A somewhat longer topic sentence.]
Not a topic sentence.

\TSOff % deactivate the Lua function
\smallskip
Hello.

[A topic sentence.]
[A somewhat longer topic sentence.]
Not a topic sentence.
\end{document}

答案3

我们不知道您的环境是如何定义的,但我认为您正在寻找(在第 102 和 103 页中找到\lbrack\rbrack符号-a4.pdf你可以在其中找到一些替代方案和其他符号名称。)
因此,定义的一个例子可能是\newenvironment{draft}[1]{\lbrack\textcolor{gray}{#1}\rbrack}

相关内容