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.
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 🙂
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:
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.