
이 문서는 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
\UrlRight
url
패키지 매뉴얼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/
있더라도 매크로는 동일하게 작동합니다.http
https
\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}
.