Saltar al contenido

Generador de códigos de seguridad

Este team de redactores ha pasado mucho tiempo investigando para darle solución a tus interrogantes, te ofrecemos la resolución así que nuestro deseo es que sea de gran ayuda.

Solución:

El problema viene con los caracteres acentuados, a menos que use XeLaTeX o LuaLaTeX. Aquí hay una solución que funciona para todos los motores (pero de todos modos se requiere UTF-8.

La entrada se secuencia y luego los distintos bits se comparan con los códigos establecidos en el preámbulo. Si el personaje resulta ser un UTF-8 prefix, se deja a un lado y se le agrega el siguiente para la comparación.

documentclassarticle
usepackageifxetex

ifxetexelse
  usepackage[utf8]inputenc
fi

usepackagexparse

ExplSyntaxOn
NewDocumentCommandnamekodam
 
  ziga_namekoda:n  #1 
 

cs_new_protected:Nn ziga_namekoda:n
 
  tl_set:Nx l__ziga_namekoda_input_tl  tl_to_str:n  #1  
  tl_replace_all:Nnn l__ziga_namekoda_input_tl  ~   
  tl_clear:N l_ziga_namekoda_output_tl
  tl_clear:N l__ziga_namekoda_current_tl
  tl_map_inline:Nn l__ziga_namekoda_input_tl
   
    __ziga_namekoda_step:n  ##1 
   
  tl_use:N l_ziga_namekoda_output_tl
 

cs_new_protected:Nn __ziga_namekoda_step:n
 
  str_case_x:nnF  #1 
   
     char_generate:nn  "C3   12    __ziga_namekoda_add:n  #1  
     char_generate:nn  "C4   12    __ziga_namekoda_add:n  #1  
     char_generate:nn  "C5   12    __ziga_namekoda_add:n  #1  
   
    __ziga_namekoda_go:n  #1  
 

cs_new_protected:Nn __ziga_namekoda_add:n
 
  tl_put_right:Nn l__ziga_namekoda_current_tl  #1 
 
cs_new_protected:Nn __ziga_namekoda_go:n
 
  __ziga_namekoda_add:n  #1 
  tl_put_right:Nx l_ziga_namekoda_output_tl
   
    str_case:VV l__ziga_namekoda_current_tl c_ziga_namekoda_codes_tl .
   
  tl_clear:N l__ziga_namekoda_current_tl
 
cs_generate_variant:Nn str_case:nn  VV 

tl_const:Nx c_ziga_namekoda_codes_tl
 
   tl_to_str:n  a    1 
   tl_to_str:n  A    1 
   tl_to_str:n  b    2 
   tl_to_str:n  B    2 
   tl_to_str:n  c    3 
   tl_to_str:n  C    3 
   tl_to_str:n  č    4 
   tl_to_str:n  Č    4 
   tl_to_str:n  d    5 
   tl_to_str:n  D    5 
   tl_to_str:n  e    6 
   tl_to_str:n  E    6 
   tl_to_str:n  f    7 
   tl_to_str:n  F    7 
   tl_to_str:n  g    8 
   tl_to_str:n  G    8 
   tl_to_str:n  h    9 
   tl_to_str:n  H    9 
   tl_to_str:n  i    10 
   tl_to_str:n  I    10 
   tl_to_str:n  j    11 
   tl_to_str:n  J    11 
   tl_to_str:n  k    12 
   tl_to_str:n  K    12 
   tl_to_str:n  l    13 
   tl_to_str:n  L    13 
   tl_to_str:n  m    14 
   tl_to_str:n  M    14 
   tl_to_str:n  n    15 
   tl_to_str:n  N    15 
   tl_to_str:n  o    16 
   tl_to_str:n  O    16 
   tl_to_str:n  p    17 
   tl_to_str:n  P    17 
   tl_to_str:n  r    18 
   tl_to_str:n  R    18 
   tl_to_str:n  s    19 
   tl_to_str:n  S    19 
   tl_to_str:n  š    20 
   tl_to_str:n  Š    20 
   tl_to_str:n  t    21 
   tl_to_str:n  T    21 
   tl_to_str:n  u    22 
   tl_to_str:n  U    22 
   tl_to_str:n  v    23 
   tl_to_str:n  V    23 
%   tl_to_str:n  x     
%   tl_to_str:n  X     
%   tl_to_str:n  y     
%   tl_to_str:n  Y     
   tl_to_str:n  z    24 
   tl_to_str:n  Z    24 
   tl_to_str:n  ž    25 
   tl_to_str:n  Ž    25 
   tl_to_str:n  _    26 
   tl_to_str:n     26 

ExplSyntaxOff

begindocument

namekodaŽiga Lausegger

namekodaŽIGA LAUSEGGER

namekodaMarko Milič

enddocument

La salida es la misma para todos los motores.

ingrese la descripción de la imagen aquí

Explicación

Parece que desea el alfabeto esloveno, con č, š y ž (otros caracteres extranjeros comunes como ć podrían adaptarse fácilmente).

El principal problema es que los caracteres con diacrítico no son un solo byte en UTF-8 y que pdflatex emula la entrada UTF-8 leyendo el “prefix”Que buscará en los siguientes bytes.

En el caso del esloveno, los prefijos son bytes. 0xC3, 0xC4 y 0xC5. Examinar un personaje a la vez no funcionará, por lo que necesitamos una estrategia diferente.

El principal macro funciona haciendo un string representación de la entrada. Luego irá un carácter a la vez comparándolo con una lista dada de casos; si el personaje es un prefix, simplemente se almacena y se lee el siguiente, formando una secuencia de dos bytes que se compara con la lista dada.

La lista precargada funciona de manera similar: cada carácter se convierte en uno o dos bytes string, y una lista de tokens útil como segundo argumento para str_case:nn Esta preparado.

Entonces, ¿qué pasa con el nombre Žiga? los string formado a partir de él contendrá los bytes

C5 BD 69 67 61

Cuando el string está mapeado, el primer byte se reconocerá como un prefix, así que déjelo a un lado y se le agregará el siguiente byte; luego la lista de tokens construida se compara con str_case:nn (en la variante str_case:VV) y así se devuelve el número 25, seguido de un punto. Las fichas 25. se almacenan en la lista de tokens para la salida y se examina el siguiente carácter. Repite hasta el final.

Finalmente se entrega la lista de tokens para la salida.

En caso de que se usen XeLaTeX o LuaLaTeX, la pregunta es más simple, porque los caracteres UTF-8 se convierten en una sola entidad cuando se lee el archivo, por lo que el paso con la verificación de prefijos nunca sucederá, pero la salida será la misma. sin embargo.

He modificado la respuesta de egreg de Cómo repetir sobre todos los caracteres en un string? por tu problema

documentclassarticle
usepackagexstring

makeatletter
newcommandkoda[1]%
   @tfornext:=#1domyListnext%

makeatother

newcommandmyList[1]%
    IfEqCase#1%
       a1.%
       b2.%
       c3.%
       č4.%
       d5.%
       e6.%
       f7.%
       g8.%
       h9.%
       i10.%
       j11.%
       k12.%
       l13.%
       m14.%
       n15.%
       o16.%
       p17.%
       r18.%
       s19.%
       š20.%
       t21.%
       u22.%
       v23.%
       z24.%
       ž25.%
       _26.%
        26.%
    % you can add more cases here as desired
   [PackageErrorkodaUndefined option to koda: #1]%
%


begindocument
    kodaname_surname
enddocument

No parece manejar el espacio correctamente, así que inserté _ en cambio, pero es algo 🙂

ingrese la descripción de la imagen aquí

EDITAR: Busqué un poco y recordé de dónde tenía la respuesta.

Puedes hacer esto usando def para extraer de forma recursiva los caracteres del nombre:

documentclassarticle
usepackagexstring
usepackage[utf8]inputenc

newcommandrealkoda[1]%
IfEqCase#1%
    a1.%
    b2.%
    c3.%
    č4.%
    d5.%
    e6.%
    f7.%
    g8.%
    h9.%
    i10.%
    j11.%
    k12.%
    l13.%
    m14.%
    n15.%
    o16.%
    p17.%
    r18.%
    s19.%
    š20.%
    t21.%
    u22.%
    v23.%
    z24.%
    ž25.%
    _26.%
    S26.%
    % you can add more cases here as desired
[PackageErrorkodaUndefined option to koda: #1]%
%
makeatletter
defrunningkoda#1#[email protected]ifx#1!relaxelserealkoda#1ifx#2!relaxelserunningkoda#[email protected]fifi
defprekoda#1 #[email protected]ifx#2relaxrelaxrunningkoda#[email protected]elserunningkoda#1S#[email protected]fi
newcommandkoda[1]prekoda#1 @
makeatother

begindocument

Name surname: kodaname surname

Name_surname: kodaname_surname

enddocument

La idea es que koda llamadas runningkoda con algunos personajes callejeros [email protected] al final y runningkoda los usa para probar si está o no al final de la lista de caracteres. Si no entonces #1 se le da al original koda macro, ahora llamado realkoda, y #[email protected] se da como argumento para runningkoda. Tenemos que dar @ cada vez porque el anterior @ es engullido cada vez runningkoda se utiliza.

Hacer frente a los espacios en los nombres es un poco más complicado, pero utiliza la misma idea. “Preproceso” el nombre con prekoda para ordenar el nombre en el bit antes del espacio y el bit después. El espacio se reemplaza con un S y realkoda reconoce esto y lo reemplaza con el “código” 26. Actualmente, esto hace frente a un solo espacio en el nombre. Si es necesario, debería / podría ser posible permitir múltiples espacios usando SplitArgument de xparse.

Aquí está el resultado:

ingrese la descripción de la imagen aquí

Mi macro dará un error si lo pasa un vacío string.

Si haces scroll puedes encontrar las interpretaciones de otros usuarios, tú además eres capaz insertar el tuyo si te gusta.

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


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

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