在“foreach”中使用“xstring”函数时添加了奇怪的字符

在“foreach”中使用“xstring”函数时添加了奇怪的字符

我正在尝试创建一个显示字符串列表的宏,如果字符串以“*”开头,它会应用特定样式(如粗体)。

因此我使用了 foreach 和 xstring 宏,但显示的奇怪字符出现了问题。

我做了两个案例,只有第二个案例不起作用,但我需要在第二个案例的配置中找到解决方案。


配置:

MacOS Monterey,套装 M1

从 brew 安装 LaTeX 环境(mactex)


情况1:

主文本

\documentclass[10pt,a4paper]{article}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[default]{lato}
\usepackage{pgffor}
\usepackage{xstring}

% Command
\newcommand{\simplelist}[1]{%
  \foreach \item in {#1}{
    \item
    \hspace{1cm}
  }
}

\newcommand{\enhancedlist}[1]{%
  \foreach \item in {#1}{%
    \IfSubStr{\item}{*}
      {\textbf{\StrGobbleLeft{\item}{1}}}
      {\item}

    \hspace{1cm}
  }
}

% Document
\begin{document}
\StrGobbleLeft{*item1}{1}\par
\simplelist{item1,*item2,item3}\par
\enhancedlist{item1,*item2,item3}
\end{document}

构建命令

latexmk -synctex=1 -interaction=nonstopmode -file-line-error -pdf main

结果

案例 1 结果


案例 2:

主程序库.tex

\documentclass[10pt,a4paper]{custom_library}

\usepackage[T1]{fontenc}    % Example is working if removed
\usepackage[utf8]{inputenc}
\usepackage[default]{lato}

% Document
\begin{document}
\StrGobbleLeft{*item1}{1}\par
\simplelist{item1,item2,*item3}\par
\enhancedlist{item1,item2,*item3}
\end{document}

自定义库.tex

\@ifl@t@r\fmtversion{2018/04/01}{\UseRawInputEncoding}{}
\LoadClass{extarticle}

\RequirePackage{xstring}
\RequirePackage{pgffor}

% Commands
\newcommand{\simplelist}[1]{%
  \foreach \item in {#1}{
    \item
    \hspace{1cm}
  }
}

\newcommand{\enhancedlist}[1]{
  \foreach \item in {#1}{
    \IfSubStr{\item}{*}
      {\textbf{\StrGobbleLeft{\item}{1}}}
      {\item}

    \hspace{1cm}
  }
}

构建命令

latexmk -synctex=1 -interaction=nonstopmode -file-line-error -pdf main_with_lib

结果

在此处输入图片描述


在案例 2 中,似乎如果我删除“\usepackage[T1]{fontenc}”,它就会运行良好。但就像我说的,我在一个更大的项目中使用此代码,我必须保留案例 2 中设置的配置。

有什么想法吗?解释一下?:)

答案1

在您的定义之后,{\item}您有控制字符 U+2029(段落分隔符)

通常,如果您在 LaTeX 中使用该字符(此处位于 [] 之间):

\documentclass{article}
\usepackage[T1]{fontenc}
\begin{document}

U+2029 PARAGRAPH SEPARATOR [
]
\end{document}

你得到

! LaTeX Error: Unicode character 
 (U+2029)
               not set up for use with LaTeX.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...                                              
                                                  
l.5 U+2029 PARAGRAPH SEPARATOR [

                                   ]
?

但是您的文档使用\UseRawInputEncoding禁用 LaTeX 编码支持的功能,因此编码 U+2029 的原始字节在任何情况下都被视为三个单独的字符字体编码是当前的,因此

没有错误但有输出

在此处输入图片描述

如果你使用 OT1 编码,你会得到输出

在此处输入图片描述

但这并不是真正的改进,它仍然排版无意义的字符,但现在会发出警告

Missing character: There is no � in font cmr10!
Missing character: There is no � in font cmr10!
Missing character: There is no � in font cmr10!

因为 OT1 编码没有重音字符。


因此,首先要从该行中删除 U+2029

      {\item}


(您可能会发现最简单的方法是删除该行并重新输入)

然后移除

\@ifl@t@r\fmtversion{2018/04/01}{\UseRawInputEncoding}{}

但这对于我们来说毫无帮助。

与错误无关,但我不会将其用作\item本地循环变量,它是一个标准的乳胶命令,因此会使任何调试它的人感到困惑。

相关内容