\if(nombre de usuario == foo) ... \else... \fi?

\if(nombre de usuario == foo) ... \else... \fi?

Creo que el pseudocódigo del título lo dice todo: ¿Cómo puede TeX (o LaTeX) descubrir el $USER que está ejecutando pdflatex?

Estoy colaborando y quiero que el resultado se vea ligeramente diferente cuando lo ejecuto latexen comparación con cuando lo hace mi colaborador.

Respuesta1

Un método que debería funcionar en todos los sistemas operativos (pero es básicamente el mismo que el de David) y que también necesita -shell-escape:

\documentclass{article}
\usepackage{catchfile}

% #1 = control sequence to define
% #2 = variable to get the value of
\newcommand{\getvar}[2]{%
  \CatchFileEdef#1{"|kpsewhich -var-value #2"}{\endlinechar=-1 }%
}

\def\me{enrico}
\getvar{\usrtest}{USER}

\begin{document}

\ifx\me\usrtest ME \else IMPOSTER\fi

\end{document}

Con kpsewhichpodemos evitar cotizaciones y dólares o %; el programa debería funcionar igual en TeX Live y en MiKTeX. Por supuesto, el nombre de la variable a configurar puede ser diferente en los distintos sistemas operativos: USERen los Unix y USERNAMEen los Windows.

Respuesta2

Mi humilde intento con LuaLaTeX:

\documentclass{article}

\usepackage{luacode}
\usepackage[T1]{fontenc}

\begin{luacode}
-- get the username variable,
-- or a default string in case
-- the variable is not found
function getUsername()
    return os.getenv("USERNAME") or "Oh no!"
end

-- let's do a simple comparison
-- and print the test result
function checkUsername(username)
    if username == getUsername() then
        tex.print("Authenticated.")
    else
        tex.print("I'm calling the \\TeX\\ police.")
    end
end
\end{luacode}

\newcommand\authenticate[1]{\luadirect{checkUsername(\luastring{#1})}}

\begin{document}

Trying with \verb|paulo|: \authenticate{paulo}

Trying with \verb|david|: \authenticate{david}

\end{document}

La salida:

llama a la policia

Respuesta3

esto necesita

pdflatex --shell-escape

ingrese la descripción de la imagen aquí

\documentclass{article}


\makeatletter
{\everyeof{\noexpand}
\xdef\usrtest{\@@input"|echo \string$USER""\expandafter}}
\makeatother

\def\me{davidc}

\begin{document}

\ifx\me\usrtest ME \else IMPOSTER\fi

\end{document}

Respuesta4

Como dije, no creo que puedas acceder al nombre de usuario directamente (Editar: OK, entonces puedes, ver arriba), pero el optionalpaquete debería funcionar bien:

\documentclass{minimal}
\usepackage[bob]{optional}    %\usepackage[joe]{optional}

\begin{document}
    This document was compiled by \opt{joe}{Joe Schmoe}\opt{bob}{Bob Wilbur}!
\end{document}

información relacionada