使用特殊 Unicode 字符进行去标记化的替代方法

使用特殊 Unicode 字符进行去标记化的替代方法

我已经使用定义了新命令\NewDocumentCommand表示图中节点的描述。它包含姓名(作为参数提供),一些文本描述(作为参数提供)和链接到其他节点(以分号分隔的列表指定姓名s 在论点中)。从回答到问题,我发现了\detokenize命令,它允许我正确显示节点姓名s 包含下划线。(我也在\paragraphnames、\labelnames 和\references 中使用它。)

问题是,当我\detokenize在文本描述中使用时,一些 Unicode 字符会被替换为错误的字符。(例如,softvér被替换为softvŠr。)有没有其他的替代方法\detokenize?我只需要自动转义某些描述中存在的<和。我可以使用和,但我必须使用名称(这样引用才能起作用,我无法正确转义它,因为它是宏的参数),所以我希望具有一定的一致性并提供>\textlesstextgreaterdetokenize描述未逃脱。

编辑 这里有一个小例子:

\documentclass[12pt, oneside]{book}
\usepackage[a4paper,top=2.5cm,bottom=2.5cm,left=3.5cm,right=2cm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[IL2]{fontenc}
\usepackage[hidelinks,breaklinks]{hyperref}
\usepackage[slovak]{babel}
\usepackage{nameref}
\usepackage{xparse}
\usepackage{ifthen}
\linespread{1.25}

\NewDocumentCommand\mynode{mm>{\SplitList{;}}m>{\SplitList{;}}m}
{
    \paragraph[\detokenize{#1}]{\detokenize{#2} (\texttt{\detokenize{#1}}):}
    \label{\detokenize{#1}}
    \begin{itemize}
        \item vstupné hrany:
        \ProcessList{#3}{ \insertdep }
        \item výstupné hrany:
        \ProcessList{#4}{ \insertdep }
    \end{itemize}
}
\newcommand{\insertdep}[1]{
\ifthenelse{\equal{}{#1}}{\texttt{-}}{\texttt{\nameref{\detokenize{#1}}};}
}

\begin{document}
\mynode{root}{Koreň}{root}{gui}
\mynode{gui}{Grafické rozhranie}{root}{nice_gui;fancy_gui}
\mynode{nice_gui}{Pekné grafické rozhranie}{gui}{}
\mynode{fancy_gui}{This text contains less and greater characters:<>}{gui}{}
\end{document}

\detokenize{#2}破坏了特殊的斯洛伐克字符(与仅使用相比#2)。我注意到,它甚至没有修复问题_<>。我注意到,当我使用\verb|#2|而不是 时\detokenize{#2},斯洛伐克字符和工作,但它显然改变了格式,并且由于某种原因在文本末尾<>添加了下划线,并且下划线仍然使乳胶插入数学模式并制作下标。|

我正在用来pdflatex编译。

答案1

它比使用 稍微复杂一些\detokenize,尤其是使用IL2。顺便问一下,你真的需要它吗?

这是一种预处理输入以便转换_<>为适当命令的方法。

\documentclass[12pt, oneside]{book}
\usepackage[a4paper,top=2.5cm,bottom=2.5cm,left=3.5cm,right=2cm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[IL2]{fontenc}
\usepackage[slovak]{babel}
\usepackage{nameref}
\usepackage{xparse}
\usepackage[hidelinks,breaklinks]{hyperref}

\ExplSyntaxOn

\NewDocumentCommand\mynode{mmmm}
 {
  \mynode_main:nnnn { #1 } { #2 } { #3 } { #4 }
 }

\seq_new:N \l_mynode_input_seq
\seq_new:N \l_mynode_output_seq
\tl_new:N \l_mynode_node_tl
\tl_new:N \l_mynode_text_tl

\cs_new_protected:Nn \mynode_main:nnnn
 {
  \seq_set_split:Nnn \l_mynode_input_seq { ; } { #3 }
  \seq_set_split:Nnn \l_mynode_output_seq { ; } { #4 }
  \tl_set:Nn \l_mynode_node_tl { #1 }
  \mynode_replace:N \l_mynode_node_tl
  \tl_set:Nn \l_mynode_text_tl { #2 }
  \mynode_replace:N \l_mynode_text_tl

  \mynode_paragraph:VV \l_mynode_node_tl \l_mynode_text_tl
  \label{ \tl_to_str:n { #1 } }

  \begin{itemize}
    \item vstupné~hrany:~
    \seq_map_variable:NNn \l_mynode_input_seq \l_mynode_node_tl
     {
      \mynode_print:N \l_mynode_node_tl
     }
    \item výstupné~hrany:~
    \seq_map_variable:NNn \l_mynode_output_seq \l_mynode_node_tl
     {
      \mynode_print:N \l_mynode_node_tl
     }
  \end{itemize}
 }

\cs_new_protected:Nn \mynode_paragraph:nn
 {
  \paragraph[#1]{#2~(\texttt{#1}):}
 }
\cs_generate_variant:Nn \mynode_paragraph:nn { VV }

\cs_new_protected:Nn \mynode_print:N
 {
  \texttt
   {
    \tl_if_empty:NTF #1
      { - }
      { \nameref { \tl_to_str:N #1 } }
   };~
 }

\cs_new_protected:Nn \mynode_replace:N
 {
  \regex_replace_all:nnN { \_ } { \c{_} } #1
  \regex_replace_all:nnN { \< } { \c{textless} } #1
  \regex_replace_all:nnN { \> } { \c{textgreater} } #1
 }

\NewDocumentCommand{\change}{m}
 {
  \tl_set:Nn \l_mynode_text_tl { #1 }
  \mynode_replace:N \l_mynode_text_tl
  \tl_use:N \l_mynode_text_tl
  %\tl_analysis_show:N #1 %%% for debugging
 }
\ExplSyntaxOff

\begin{document}

\mynode{root}{Koreň}{root}{gui}

\mynode{gui}{Grafické rozhranie}{root}{nice_gui;fancy_gui}

\mynode{nice_gui}{Pekné grafické rozhranie}{gui}{}

\mynode{fancy_gui}{This text contains less and greater characters:<>}{gui}{}

\mynode{<test>}{Some text with \texttt{under_score}}{<test>}{}
\end{document}

在此处输入图片描述

答案2

实际上,你有两个不同的问题:字体编码和一个文本编码。遗憾的是,我只能帮助您解决第二个问题。

\detokenize不是 UTF8 友好的,但有时你可以用以下命令替换它:

\newcommand{\utffriendlydetokenize}[1]{%
\scantokens{%
\catcode`\_=12%
\catcode`\^=12%
\catcode`\{=12%
\catcode`\}=12%
\catcode`\&=12%
\catcode`\$=12%
\catcode`\#=12%
\catcode`\~=12%
\catcode`\\=12%
#1%
}%
}

(来源:https://gitlab.com/Nickkolok/biblatex2bibitem/-/blob/master/biblatex2bibitem.sty

就您而言,唯一需要更改的行是:

\paragraph[\detokenize{#1}]{\utffriendlydetokenize{#2} (\texttt{\detokenize{#1}}):}

你会得到ň回报: 补丁结果

但是,它不能修复 的问题<>_,因为该问题是由 中指定的符号的代码引起的fontenc。(另请参阅\detokenize 和下划线的奇怪行为) 唯一能想到的附加解决方案是_<>通过使用它们的catcodes 来重新定义为活动角色,将它们映射到相应的命令并纠正\utffriendlydetokenize所选catcodes 的定义。

相关内容