将 \newunicodechar 与分隔符大小 \big、\left、\right 等相结合

将 \newunicodechar 与分隔符大小 \big、\left、\right 等相结合
\documentclass[11pt]{standalone}
\usepackage[utf8]{inputenc}
\usepackage{newunicodechar}
\newunicodechar{‖}{\ensuremath{\|}}
\begin{document}
$$ ‖x‖ $$
$$ \big‖x\big‖ $$  % Error: Missing delimiter
\end{document}

我们能以某种方式\big让它工作吗?

答案1

使用\ensuremath没有意义。

您可以使其与 一起使用pdflatex,但必须使用带有\big或 类似命令的括号。 而不能与\left和 一起使用\right

\documentclass{article}
\usepackage{amsmath}
\usepackage{newunicodechar}
\newunicodechar{‖}{\|}

\begin{document}

\[
‖x‖ + \bigl{‖}x\bigr{‖} + \left‖\frac{x}{2}\right‖
\]

\end{document}

在此处输入图片描述

问题是它不是一个单个字节,而\bigl只吸收了第一个字节。

常见的警告。 $$不应在 LaTeX 中使用,并且\big不是该用例的正确命令。

另一方面\lVert\rVert 适合该用例的正确命令。

答案2

出于“学术”目的,这是一个自动支撑下一个 Unicode 字符的宏。

然而它确实需要修补\big。这是不可避免的。

TeX 输入流的工作原理有点复杂,你仍然需要 TeX 知识来使用这个宏不是 100% 自动的。

它只在 pdflatex 中有效 —— 不过如果您使用某些 Unicode 引擎则根本不需要此代码。

附注--如果您在包中使用它/扩展代码等,\__stored_content自己修复等的命名约定,参见expl3手册interface3.pdf。

\tl_analysis_map_inline:nn仅用于检查它是否是一个活动字符,而不是像例如\str_count:n处理一些不太可能的情况,即存在长度为 1 的控制序列等\escapechar=-1

%! TEX program = pdflatex
\documentclass{article}
\usepackage{newunicodechar}
\errorcontextlines=100
\newunicodechar{‖}{\ensuremath{\|}}

\begin{document}


\ExplSyntaxOn

% command docs:
% if you execute `\__brace_next_unicode:nw {blob blob} ■` where ■ is any
% multi-byte UTF8 character, after some execution steps `blob blob {■}`
% will be executed. (spaces are only for demonstration.)

\cs_new_protected:Npn \__brace_next_unicode:nw #1 {
 \peek_N_type:TF {
  \tl_set:Nn \__stored_content {#1}  % actually this part can be done expandably
        % as well... but \peek_N_type:TF is already unexpandable
  \__brace_next_unicode_get_one_byte:N
 }
 {
  % do nothing, just put `blob blob` out
  #1
 }
}

\cs_new_protected:Npn \__brace_next_unicode_get_one_byte:N #1 {
 \tl_analysis_map_inline:nn {#1} {
  \bool_set:Nn \__is_active_character { \token_if_eq_charcode_p:NN ##3 D }
 }
 \bool_if:nTF \__is_active_character {
  \int_compare:nNnTF {`#1} < {"80} {
   % not a part of multibyte UTF8 character, put it back.
   \__stored_content #1
  } {
   % part of multibyte UTF8 character.
   \int_compare:nNnTF {`#1} < {"E0} {
    % 2 bytes
    \__brace_next_unicode_handle_two:nn #1
   } {
    \int_compare:nNnTF {`#1} < {"F0} {
     % 3 bytes
     \__brace_next_unicode_handle_three:nnn #1
    } {
     % 4 bytes
     \__brace_next_unicode_handle_four:nnnn #1
    }
   }
  }
 }
 {
  % else, it could be a control sequence or similar. Do nothing with it.
  \__stored_content #1
 }
}

\cs_new_protected:Npn \__brace_next_unicode_handle_two:nn #1 #2 {
 \__stored_content {#1 #2}
}

\cs_new_protected:Npn \__brace_next_unicode_handle_three:nnn #1 #2 #3 {
 \__stored_content {#1 #2 #3}
}

\cs_new_protected:Npn \__brace_next_unicode_handle_four:nnnn #1 #2 #3 #4 {
 \__stored_content {#1 #2 #3 #4}
}

%\__brace_next_unicode:nw {\pretty:nn {123}} ■

\NewCommandCopy \oldbig \big
\def \big {\__brace_next_unicode:nw {\oldbig}}

\ExplSyntaxOff




\[ ‖x‖ \]
\[ \big‖x\big‖ \]

% check that it still works in normal cases
\[ \big|x\big| \]
\[ \big|x\big| \]
\[ \big{|}x\big{|} \]
\[ \big{|}x\big{|} \]
\[ \big\lbrace x\big\rbrace \]


\end{document}

相关内容