我如何定义自定义数学快捷符号,例如 $?

我如何定义自定义数学快捷符号,例如 $?

我希望我的文档中有类似的东西§§ ... §§可以替换\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}

相关内容