매크로에서 \url{https://example.com/path}를 \href{https://example.com/path}{path}로 다시 작성합니다.

매크로에서 \url{https://example.com/path}를 \href{https://example.com/path}{path}로 다시 작성합니다.

이 문서는 BibTeX에서 생성된 .bbl 파일에서 잘라낸 것입니다.

\documentclass{article}
\usepackage{url}
\usepackage{hyperref}
\newcommand{\showDOI}[1]{\textsc{doi:}#1}
\begin{document}
\urldef\tempurl\url{https://doi.org/10.1016/j.comnet.2004.08.013}
\showDOI{\tempurl}
\end{document}

다음과 같이 렌더링됩니다.

여기에 이미지 설명을 입력하세요

문서를 읽은 것처럼 출력하고 싶습니다.

\documentclass{article}
\usepackage{url}
\usepackage{hyperref}
\newcommand{\showDOI}[1]{\textsc{doi:}#1}
\begin{document}
\showDOI{\href{https://doi.org/10.1016/j.comnet.2004.08.013}%
              {\UrlFont 10.1016/j.comnet.2004.08.013}
\end{document}

여기에 이미지 설명을 입력하세요

PDF 하이퍼링크는 여전히 전체 URL을 가리키고 있습니다.

그러나 나는 .bst 파일을 망칠 필요가 없고 Apply before is Expanded \verb와 같은 동작이 필요하기 때문에 — 내 실제 참고문헌에 있는 일부 DOI에는 밑줄 및/또는 퍼센트 기호가 있습니다 — 나는 변화를 통해 이것을 달성하고 싶다\url\showDOI오직의 정의 \showDOI이지 사용되는 방식이 아닙니다.

이것이 가능한가? 그렇다면 어떻게?

답변1

에 의해 생성된 URL의 일반 텍스트는 및 를 \urldef정의하여 수정할 수 있습니다 . 에서 적응\UrlLeft\UrlRighturl패키지 매뉴얼xstring, 문자열 처리에 사용 :

\documentclass{article}
\usepackage{url}
\usepackage{hyperref}
\usepackage{xstring}
\setlength{\parskip}{1em}   % for presentation only

\newcommand{\showDOI}[1]{%
\let\oldleft\UrlLeft%
\let\oldright\UrlRight%
\def\UrlLeft##1\UrlRight{\StrGobbleLeft{##1}{16}}%
\textsc{doi:} #1%
\let\UrlLeft\oldleft%
\let\UrlRight\oldright%
}

\begin{document}
\url{http://www.regular-url.com/}

\urldef\tempurl\url{https://doi.org/10.1016/j.comnet.2004.08.013}
\showDOI{\tempurl}

\url{http://www.other-url.com/}
\end{document}

hyperref이는 원래 인수를 사용하여 먼저 링크를 생성한 다음 패키지를 사용하여 링크 형식을 지정 url하고 제공된 정의를 사용하기 때문에 작동합니다 . 일반 URL이 잘리는 것을 방지하려면 DOI 디스플레이 주위에 정의를 저장하고 복원해야 한다는 점에 유의하세요.

결과(링크 대상이 도구 설명으로 표시됨):

여기에 이미지 설명을 입력하세요

답변2

\documentclass{article}
\usepackage{hyperref}
\makeatletter
\def\showDOI#1{\expandafter\showDOI@i#1\@nil}
\def\showDOI@i#1//#2/#3\@nil{\textsc{DOI:} \href{#1//#2/#3}{\UrlFont#3}}
\makeatother
\begin{document}
\def\tempurl{https://doi.org/10.1016/j.comnet.2004.08.013}
\showDOI{\tempurl}%

\showDOI{https://doi.org/10.1016/j.comnet.2004.08.013}
\end{document}

여기에 이미지 설명을 입력하세요

답변3

이전에 오는 항목을 모두 제거해 보겠습니다 . 따라서 대신에 가 doi.org/있더라도 매크로는 동일하게 작동합니다.httphttps

\documentclass{article}
\usepackage{xparse}
\usepackage{hyperref}

\ExplSyntaxOn
\NewDocumentCommand{\showDOI}{m}
 {
  \textsc{doi:}
  %\nobreakspace % if you want a space, uncomment this
  \zwol_showdoi:n { #1 }
 }

\tl_new:N \l__zwol_showdoi_tl
\tl_new:N \l__zwol_showdoi_full_tl

\cs_new_protected:Nn \zwol_showdoi:n
 {
  \tl_if_single:nTF { #1 }
   { % single token
    \cs_if_exist:cTF { \cs_to_str:N #1 ~ }
     {% we assume it is \urldef
      \__zwol_showdoi_urldef:c { \cs_to_str:N #1 ~ }
     }
     {
      \tl_set:Nx \l__zwol_showdoi_tl { #1 }
     }
   }
   {
    \tl_set:Nn \l__zwol_showdoi_tl { #1 }
   }
  \tl_set_eq:NN \l__zwol_showdoi_full_tl \l__zwol_showdoi_tl
  \regex_replace_once:nnN { \A .*doi\.org/ } { } \l__zwol_showdoi_tl
  \href{\l__zwol_showdoi_full_tl}{\UrlFont\l__zwol_showdoi_tl}
 }

\cs_new_protected:Nn \__zwol_showdoi_urldef:N
 {
  \tl_set_eq:NN \l__zwol_showdoi_tl #1
  \regex_replace_once:nnN { \c{url} \cB. (.*) \cE. } { \1 } \l__zwol_showdoi_tl
 }
\cs_generate_variant:Nn \__zwol_showdoi_urldef:N { c }
\ExplSyntaxOff

\begin{document}

\urldef\tempurl\url{https://doi.org/10.1016/j.comnet.2004.08.013}

\showDOI{\tempurl}

\showDOI{https://doi.org/10.1016/j.comnet.2004.08.013}

\end{document}

여기에 이미지 설명을 입력하세요

정규 표현식이 아주 최근에 expl3 커널에 입력되었기 때문에 TeX 배포판을 업데이트해야 할 수도 있습니다. 업데이트할 수 없으면 추가하세요 \usepackage{l3regex}.

관련 정보