Saltar al contenido

Enlace único en estilo de cita (Autor, Año) usando natbib e hyperref

Hola, hemos encontrado la respuesta a lo que andabas buscando, deslízate y la encontrarás un poco más abajo.

Solución:

Vinculando postnotes en citep ya se abordó en una pregunta anterior. Para establecer la puntuación en texto negro, puede parchear los comandos de puntuación internos de natbib. Estos parches se pueden diferir hasta el comienzo de su documento para tener en cuenta el hecho de que los comandos de puntuación son redefinibles (con, digamos, bibpunct) en cualquier punto del preámbulo de su documento.

documentclassarticle
usepackagenatbib
usepackage[colorlinks]hyperref
usepackageetoolbox

makeatletter

% count citations
pretocmd[email protected]%
  let[email protected]@[email protected]@citex
  def[email protected]#2%
  setcounter[email protected]@cites0%
  setcounter[email protected]@cites0%
  forcsvliststepcounter[email protected]@cites@gobble#3
newcounter[email protected]@cites
newcounter[email protected]@cites
def[email protected]

% include postnote and citet closing bracket in hyperlink
def[email protected]@citex#1%
  stepcounter[email protected]@cites%
  [email protected]@citeb@[email protected]@citeb#1%
  ifnumequalvalue[email protected]@citesvalue[email protected]@cites
    if*[email protected]*else[email protected][email protected]globaldef[email protected]fi%
  [email protected]elseifrelax[email protected]relax
  else[email protected]@closegloballet[email protected]@emptyfifi% avoid compact citations
  [email protected]
renewcommand[email protected][2]#1

% avoid extraneous postnotes, closing brackets
patchcmd[email protected]
  [email protected]elseif*#2*else[email protected]#2fi
   ifrelax[email protected]relaxelse[email protected]@closefifi
patchcmd[email protected]
  ifrelax[email protected]relax[email protected]@citeaelse[email protected]@[email protected]fi
  ifrelax[email protected]relax[email protected]@citeaelse[email protected]@[email protected]fi
patchcmd[email protected]if*#3*if*[email protected]*

% all punctuation black
AtBeginDocument%
  preto[email protected]textcolorblackbgroup%
  appto[email protected]egroup%
  preto[email protected]textcolorblackbgroup%
  appto[email protected]egroup%
  preto[email protected]textcolorblackbgroup%
  appto[email protected]egroup%
  preto[email protected]textcolorblackbgroup%
  appto[email protected]egroup%
  preto[email protected]textcolorblackbgroup%
  appto[email protected]egroup%
  preto[email protected]textcolorblackbgroup%
  appto[email protected]egroup

makeatother

beginfilecontentsjobname.bib
@bookcompanion,
  author = Goossens, Michel and Mittelbach, Frank and Samarin, Alexander,
  title = The LaTeX Companion,
  edition = 1,
  publisher = Addison-Wesley,
  location = Reading, Mass.,
  year = 1994
@bookadams:life,
  title = Life, the Universe and Everything,
  author = Adams, Douglas,
  series = The Hitchhiker's Guide to the Galaxy,
  publisher = Pan Macmillan,
  year = 1980
@bookadams:rest,
  title = The Restaurant at the End of the Universe,
  author = Douglas Adams,
  series = The Hitchhiker's Guide to the Galaxy,
  publisher = Pan Macmillan,
  year = 1980
endfilecontents

newcommandcmd[1]textbackslashtexttt#1
begindocument
noindent
cmdcitet: citet[e.g.][pp.~1--10]companion \
cmdcitet: citet[pp.~1--10]companion,adams:rest,adams:life \
cmdcite: cite[e.g.][p.~100]adams:life; citeadams:rest \
cmdcitep: citep[e.g.][p.~1--10]adams:rest,adams:life \
cmdcitetext; cmdcitealp:
citetextsee citealp[pp.~10]adams:rest; or even better citealpadams:life \
cmdciteauthor: citeauthoradams:life; citeauthorcompanion \
cmdciteyear: citeyearadams:life; citeyearadams:rest \
bibliographystyleplainnat
bibliographyjobname
enddocument

ingrese la descripción de la imagen aquí

Jugando con mi problema y usando la solución de egreg en una publicación anterior, encontré una solución que funciona para mi caso específico:

Definí nuevos comandos mycitet y mycitep De este modo

usepackagetwoopt
usepackageifthen

newcommandblack[1]textcolor[rgb]0,0,0#1

newcommandtwooptmycitet[3][aa][bb]%
    ifthenelseequal#1aa                                                                         % if nargin == 1
      hyperlinkcite.#3citeauthor#3 black(citeyear#3black)                            %     citetkey
      ifthenelseequal#2bb                                                                      % elseif nargin == 2
        hyperlinkcite.#3citeauthor#3 black(citeyear#3black,~#1black)              %     citet[pg]key
        ifthenelseequal#1                                                                      % elseif #1 = []
          hyperlinkcite.#3citeauthor#3 black(citeyear#3black,~#2black)            %     citet[][pg]key
          ifthenelseequal#2                                                                    % elseif #2 == []
            hyperlinkcite.#3citeauthor#3 black(#1~citeyear#3black)                   %     citet[eg][]key
            %                                                                                           % else
            hyperlinkcite.#3citeauthor#3 black(#1~citeyear#3black,~#2black)       %     citet[eg][pg]key
          
        
      
}

makeatletter 
newcommandmulticite[1]% taken from egreg, see link
  @tempswafalse
  @fornext:=#1do
    [email protected]
;~else@tempswatruefi hyperlinkcite.nextciteauthornextblack,~citeyearnext% % makeatother newcommandtwooptmycitep[3][aa][bb]% ifthenelseequal#1aa % if nargin == 1 (multicite#3) % citepkey(s) ifthenelseequal#2bb % elseif nargin == 2 (hyperlinkcite.#3citeauthor#3black,~citeyear#3black,~#1) % citep[pg]key ifthenelseequal#1 % elseif #1 = [] (hyperlinkcite.#3citeauthor#3black,~citeyear#3black,~#2) % citep[][pg]key ifthenelseequal#2 % elseif #2 == [] (#1~multicite#3) % citep[eg][]key(s) % % else (#1~hyperlinkcite.#3citeauthor#3black,~citeyear#3black,~#2) % citep[eg][pg]key }

y con fines de demostración también cambié el documento a

begindocument

begintabularlll
                           & Audrey                             & me, myself and I                    \
hlinehline
citetkey               & citetauthor08                   & mycitetauthor08                  \
citet[pg]key           & citet[pg.7]author08             & mycitet[pg.7]author08            \
citet[ ][pg]key        & citet[][pg.7]author08           & mycitet[][pg.7]author08          \
citet[eg][ ]key        & citet[e.g.][]author08           & mycitet[e.g.][]author08          \
citet[eg][pg]key       & citet[e.g.][pg.7]author08       & mycitet[e.g.][pg.7]author08      \
hline
citepkey               & citepauthor08                   & mycitepauthor08                  \
citep[pg]key           & citep[pg.7]author08             & mycitep[pg.7]author08            \
citep[ ][pg]key        & citep[][pg.7]author08           & mycitep[][pg.7]author08          \
citep[eg][ ]key        & citep[e.g.][]author08           & mycitep[e.g.][]author08          \
citep[eg][pg]key       & citep[e.g.][pg.7]author08       & mycitep[e.g.][pg.7]author08      \
hline
citepkey1,key2         & citepauthor08,buthor90          & mycitepauthor08,buthor90         \
citep[eg][ ]key1,key2  & citep[e.g.][]author08,buthor90  & mycitep[e.g.][]author08,buthor90 \
endtabular

bibliographystyleplainnat
bibliographyjobname

enddocument

para obtener exactamente lo que quiero:

ingrese la descripción de la imagen aquí

Sin embargo, si bien esto puede servir perfectamente como una demostración de lo que quiero, preferiría una solución general a esta específica como

  • este enfoque no adapta los paréntesis a bibliographystyle automáticamente
  • podría estropear otros comandos si yo letcitepmycitep y letcitetmycitet

PD: ¿Alguien puede explicar cómo el fragmento de egreg sabe que ‘,’ es mi delimitador?

Recuerda que tienes la capacidad de interpretar tu experiencia .

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



Utiliza Nuestro Buscador

Deja una respuesta

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