方法 1

方法 1

在我所知道的大多数编程语言中,获取字母表中的下一个字母都不是什么问题。然而,在 LaTeX 中,这似乎并不那么简单。

我看过如何制作 26 个宏 (stackoverflow 上)但是该问题及其答案并不涉及底层unicode的操作或类似的东西。

如果完全不处理边界情况(例如小写字母“z”),那就没问题。我自己在想类似以下的事情:

\mydefalphabet abcdefghijklmnopqrstuvwxyz \mydefalphabet
\mydefalphabetshifted bcdefghijklmnopqrstuvwxyza \mydefalphabetshifted

在这种情况下,当给定非移位范围时,我可以返回移位范围内的符号吗?

设想的命令是:

\newcommand\nextletter[1]{ 
}

$\nextletter{i}$在数学模式中一样使用。然后我可以在我的公式中使用$\robotindex$(等于i)和(相当于)。$\other{\robotindex}$othernextletter

答案1

方法 1

这适用于a-z范围内的微小字母,并有一个可选参数(移位量)。

代码

\documentclass{article}
\newcommand*{\nextLetter}[2][1]{%
    \edef\numLet{\expandafter\number\expandafter`#2}%
    \edef\numNewLet{\number\numexpr\numLet+#1\relax}%
    \ifnum\numNewLet>122\relax%
        \edef\numNewLet{\number\numexpr\numNewLet-26\relax}%
    \fi%
    \expandafter\char\expandafter\numNewLet%
}
\def\robotindex{i}
\begin{document}
\nextLetter{a}%           a => b
\nextLetter{z}%           z => a
\nextLetter[13]{a}%       a => n
\nextLetter{\robotindex}% i => j
\end{document}

方法 2

这种方法使用宏\myAlphabet\myAlphabetShifted寻找“下一个”字母。

代码

\documentclass{article}
\usepackage{xstring}
\def\myAlphabet{abcdefghijklmnopqrstuvwxyz}
\def\myAlphabetShifted{bcdefghijklmnopqrstuvwxyza}
\newcommand*{\nextLetter}[1]{%
    \StrPosition{\myAlphabet}{#1}[\myPosition]%
    \StrChar{\myAlphabetShifted}{\myPosition}%
}
\def\robotindex{i}
\begin{document}
\nextLetter{a}%           a => b
\nextLetter{z}%           z => a
\nextLetter{a}%           a => b
\nextLetter{\robotindex}% i => j
\end{document}

答案2

这里有一种方法:

\documentclass{article}
\newcommand{\robotindex}{i}
\newcommand{\nextletter}[1]{\expandafter\donextletter\expandafter{#1}}
\newcommand{\donextletter}[1]{\ifnum`#1=122 \else\char\numexpr`#1+1\relax\fi}

\begin{document}
\nextletter{a}

\nextletter{\robotindex}

X\nextletter{z}X
\end{document}

输出为

XX

答案3

您只需使用Alph{}带有\alph{}计数器即可获取相应的字母:

在此处输入图片描述

代码:

\documentclass{article}
\usepackage{pgffor}%  \foreach is my preferred looping

\newcounter{CharNumber}% can probably do with out this, but I know this works.

\begin{document}
\noindent
\foreach \x in {1,...,26} {%
    \setcounter{CharNumber}{\x}%
    \Alph{CharNumber}%
}
\par\noindent
\foreach \x in {1,...,26} {%
    \setcounter{CharNumber}{\x}%
    \alph{CharNumber}%
}
\par\noindent
\foreach \x in {1,...,26} {%
    \setcounter{CharNumber}{\x}%
    \Roman{CharNumber}, %
}
\par\noindent
\foreach \x in {1,...,26} {%
    \setcounter{CharNumber}{\x}%
    \roman{CharNumber}, %
}
\end{document}

相关内容