![将 \newunicodechar 与分隔符大小 \big、\left、\right 等相结合](https://linux22.com/image/451825/%E5%B0%86%20%5Cnewunicodechar%20%E4%B8%8E%E5%88%86%E9%9A%94%E7%AC%A6%E5%A4%A7%E5%B0%8F%20%5Cbig%E3%80%81%5Cleft%E3%80%81%5Cright%20%E7%AD%89%E7%9B%B8%E7%BB%93%E5%90%88.png)
\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}