在我所知道的大多数编程语言中,获取字母表中的下一个字母都不是什么问题。然而,在 LaTeX 中,这似乎并不那么简单。
我看过如何制作 26 个宏 (stackoverflow 上)但是该问题及其答案并不涉及底层unicode的操作或类似的东西。
如果完全不处理边界情况(例如小写字母“z”),那就没问题。我自己在想类似以下的事情:
\mydefalphabet abcdefghijklmnopqrstuvwxyz \mydefalphabet
\mydefalphabetshifted bcdefghijklmnopqrstuvwxyza \mydefalphabetshifted
在这种情况下,当给定非移位范围时,我可以返回移位范围内的符号吗?
设想的命令是:
\newcommand\nextletter[1]{
}
和$\nextletter{i}$
在数学模式中一样使用。然后我可以在我的公式中使用$\robotindex$
(等于i
)和(相当于)。$\other{\robotindex}$
other
nextletter
答案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}