Saltar al contenido

Extraiga los primeros y últimos caracteres de macro ¿argumento?

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 expl3entonces 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_tlhasta 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.

¡Haz clic para puntuar esta entrada!
(Votos: 5 Promedio: 4.6)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *