Recabamos en distintos espacios y así mostrarte la respuesta a tu problema, si continúas con alguna duda déjanos la pregunta y te contestaremos con gusto, porque estamos para ayudarte.
Solución:
Podrías usar el xstring
paquete
documentclassarticle
usepackagexstring
newcommandmymacro[1]%
StrLeft#11[firstletter]%
StrRight#11[lastletter]%
First letter: firstletter
Last letter: lastletter
begindocument
mymacroABCDEF
enddocument
Estoy un poco ocupado, así que disculpe si no lo construí en usted MWE 😉
O en TeX clásico; lo siguiente define fst
y lst
ser el primer y último carácter (o estar vacío para una entrada corta)
deffl#1flx#1emptyemptyempty
defflx#1#2#3empty%
edeffst#1%
edefcdar#2%
edefcddr#3%
ifxcddrempty
letlstcdar
else
expandafterflxx
fi
#3
defflxx#1#2empty%
edefcar#1%
ifxcarempty
else
letlstcar
expandafterflxx
fi
#2empty
immediatewrite20===
flimmediatewrite20[fst][lst]
immediatewrite20===1
fl1immediatewrite20[fst][lst]
immediatewrite20===12
fl12immediatewrite20[fst][lst]
immediatewrite20===123
fl123immediatewrite20[fst][lst]
immediatewrite20===1234
fl1234immediatewrite20[fst][lst]
end
===
[][]
===1
[1][]
===12
[1][2]
===123
[1][3]
===1234
[1][4]
Aquí hay 3 soluciones usando expl3
, dependiendo de sus requisitos. Para realizar las pruebas, usaría prg_case_int:nnn
en lugar de un grupo ad-hoc de ifthenelse
declaraciones: esos son más lentos.
(1) Lo más simple es usar tl_head:n#1
para acceder al primer dígito del número, y int_mod:nn #110
para el último. Esto funciona para números inferiores a 2^31 y con versiones de expl3 desde aproximadamente junio de 2011 en adelante.
documentclassarticle
usepackageexpl3
ExplSyntaxOn
newcommand foo [2]
prg_case_int:nnn int_mod:nn #1 10
1 kern .02em relax
4 kern .03em relax
7 kern -.02em relax
prg_case_int:nnn tl_head:n #2
1 kern .02em relax
4 kern -.03em relax
5 kern .03em relax
7 kern .03em relax
ExplSyntaxOff
(2) Con una versión reciente de expl3
(mediados de enero de 2012 en adelante), utilizando tl_item:nn
es probablemente lo mejor, ya que funcionará para cualquier número entero, y probablemente no quieras forzar que tu numerador y denominador sean números enteros de todos modos. Namnely, tl_item:nn #1
da el
-th token en la lista de tokens, comenzando en cero para el token más a la izquierda (primer dígito), con índices negativos que comienzan en -1 para el token más a la derecha. En particular,
tl_item:nn abcd 0 % => a, left-most token
tl_item:nn abcd 2 % => c
tl_item:nn abcd -1 % => d, right-most token
tl_item:nn abcd -5 % => nothing: index out of bounds.
(3) Si necesita una solución que funcione tanto para números enteros arbitrariamente largos como para versiones anteriores de expl3
entonces puede reemplazar las líneas de newcommand
a prg_case_int:nnn int_mod:nn #1 10
por
%----->8---- cut here
tl_new:N l_foo_tl
newcommand foo [2] {
tl_clear:N l_foo_tl
tl_map_inline:nn #1 tl_set:Nn l_foo_tl ##1
prg_case_int:nnn l_foo_tl
%-----8<---- cut here
La idea es que pase por el string y almacenar cada carácter en l_foo_tl
hasta llegar al final de la string. Por lo tanto, el último carácter permanece en l_foo_tl
. Ese es un buen reemplazo para int_mod:nn #1 10
para obtener el último dígito. Sin embargo, las otras dos soluciones que di arriba son mejores a largo plazo (especialmente la tl_item:nn
una).
Si te ha sido de ayuda este post, sería de mucha ayuda si lo compartes con el resto seniors de esta forma contrubuyes a difundir este contenido.