我希望我的文档中有类似的东西§§ ... §§
可以替换\begin{align*} ... \end{align*}
。该怎么做?
\documentclass{article}
\begin{document}
§§ x + 1 &= 0 §§
\end{document}
编辑:我#
之前曾建议过,但已将其改为§
因为#
已经有了特殊含义。
答案1
使用 Unicode 引擎,这相当简单,因为§
是一个标记,所以你只需要向前看,如果下一个标记不是另一个 ,就放弃§
。使用 pdfTeX 有点棘手,因为§
实际上是两个标记(两个 utf-8 八位字节),所以当 TeX 看到 时,§
它必须查看两个标记才能检测到§§
。如果两者§§
都找到,它就会抓取所有内容到下一个§§
并将其放入align*
环境中。执行不是尝试嵌套它。它不起作用。
\documentclass{article}
\usepackage{amsmath}
\usepackage{iftex}
\makeatletter
\def\weird@align{\futurelet\let@token\weird@align@}
\ifpdftex
\AtBeginDocument{\DeclareUnicodeCharacter{00A7}{\weird@align}}
\def\weird@align@{%
\expandafter\ifx\@firstoftwo§\let@token
\expandafter\weird@align@@
\else
\expandafter\textsection
\fi}
\def\weird@align@@#1{\futurelet\@let@token\@weird@align@}
\def\@weird@align@{%
\expandafter\ifx\@secondoftwo§\@let@token
\expandafter\@weird@align@@
\else
\expandafter\textsection
\expandafter\let@token
\fi}
\def\@weird@align@@#1#2§§{\begin{align*}#2\end{align*}}
\else
\let\normal@sect=§
\begingroup
\catcode`\§=13
\@firstofone{%
\endgroup
\AtBeginDocument{\catcode`\§=13 \let§\weird@align}
\def\weird@align@{%
\ifx\let@token§%
\expandafter\@weird@align@@
\else
\expandafter\normal@sect
\fi}
\def\@weird@align@@#1#2§§{\begin{align*}#2\end{align*}}
}%
\fi
\begin{document}
§1
§¶
§§
x + 1 &= 0 \\
x &= -1
§§
\end{document}
答案2
如果您愿意并且能够使用 LuaLaTeX,那么设置一个预处理器类型的操作来用 替换 的实例是相当简单§§ ... §§
的\begin{align} ... \end{align}
。
\documentclass{article}
\usepackage{amsmath} % for 'align' env.
\usepackage{luacode} % for '\luaexec' environment
\luaexec{ % see https://tex.stackexchange.com/a/240185/5001
local in_display_math = false
function replace§§ ( x )
if not in_display_math then
in_display_math = true
return "\\begin{align}"
else
in_display_math = false
return "\\end{align}"
end
end
function replace_double_para ( s )
s = s:gsub ( "§§(.-)§§" , "\\begin{align} \%1 \\end{align}" )
s = s:gsub ( "§§" , replace§§ )
return s
end
}
% define a couple of LaTeX utility macros
\newcommand\ReplaceDoubleParaOn{\directlua{luatexbase.add_to_callback(
"process_input_buffer", replace_double_para, "replace_double_para" )}}
\newcommand\ReplaceDoubleParaOff{\directlua{luatexbase.remove_from_callback(
"process_input_buffer", "replace_double_para" )}}
\begin{document}
\ReplaceDoubleParaOn % activate the Lua function
§§ 5+5 &=10 §§
§§
1+1 &= 2 \\
3+3 &= 6 \\
9+9 &=18
§§
\ReplaceDoubleParaOff % deactivate the Lua function
§§§§§§§§§§§§§§§§
\end{document}