有没有巧妙的方式来引用推文?我用的是《芝加哥格式手册》,上面只说这,但这还不算是一个真正的指南。
理想情况下,你可以有一个宏,只需将推文的 URL 放入其中,如下所示:
\tweet{https://twitter.com/Horse_ebooks/status/382466889332445184}
... 然后在您的页面上一个漂亮的框中看到推文,并附上参考书目。不确定这是否可行,即使从理论上来说?
我的序言的相关部分:
\usepackage[backend=biber,isbn=false,notes]{biblatex-chicago}
在主文件中,我有:
\bibliography{biblio/biblio.bib}
下一步该怎么做?很抱歉遇到这样的麻烦,希望有人能帮忙!
答案1
我喜欢你的问题。是的,可以获取推文并添加到参考书目中。
我制作了一个允许引用推文的“代码”。首先,我将解释这个想法,然后我将解释代码。(它使用latex
和python
)
想法
可以使用
curl
(获得的字符串是json
格式)获取推文,并且 latex 包download
允许使用 curl。要将格式转换
json
为,bibtex
可以使用 中的一个小脚本python
,它将获得一个包含推文数据的 .bib 文件。(我不知道 latex 是否有一些包可以做到这一点)。最后,可以定义一些
driver
条目tweet
和一些宏来管理推文。
代码
1. 获取推文格式json
该download
包允许您使用 获取推文curl
。其使用形式如下:
\download[filelocalname]{url}
filelocalname
是您计算机中文件的名称。url
是推文的 url(json)。 这很重要! 在您的问题中,您显示了示例 url:
https://twitter.com/Horse_ebooks/status/382466889332445184
但在这里,只有推文的url
才是重要的。与包一起使用的 for是:ìdnumber
382466889332445184
url
download
https://api.twitter.com/1/statuses/oembed.json?id=idnumber
例如,在您的示例中,url 是:
https://api.twitter.com/1/statuses/oembed.json?id=382466889332445184
然后\tweetadd
是 latex 中的一个宏,它接收idnumber
并以 json 格式下载推文,并将其保存到磁盘并以名称保存idnumber.tweet
。
\def\tweetadd#1{\download[#1.tweet]{https://api.twitter.com/1/statuses/oembed.json?id=#1}}
2. 将推文从json
一种格式转换为bibtex
另一种格式。(twitt.py
)
Beautiful Soup 4
是必需的。安装说明如下这里。Beautiful Soup 4 用于获取tweet
文本,因为在使用包获取的文件中,download
推文是html
格式的,并且 Beautiful Soup 4 允许您提取text
推文的和date
。
其他 Python 包是标准包(json
、re
和os
)。解码使用包 (latex)json
获得的文件并提取推文的、和。其他字段(、)使用获得。download
author name
author url
url
username
date
re
python 脚本 ( twitt.py
) 的工作原理很简单。script
输入是directory
随包下载的文件在哪里\download
,并查找所有带有扩展名的文件.tweet
。script
处理每个文件并使用 bibtex 数据创建一个文件 (.bib)(.bib
每个.tweet
文件一个文件)。
使用的bibtex的字段有:
a.
author
推文作者的姓名。b.
title
推文文本。c.
url
推文网址。d.
nameaddon
作者的用户名(@...)。e.
addendum
作者个人资料的网址。f.
date
推文的日期。
输入键是tweet:idnumber
。
最后,为每个文件script
创建一个.tex
包含的文件。文件名称为。\addbibresource
.bib
tweetsinputbib.tex
twitt.py
3. 如何从乳胶中运行?
脚本遵循解释的方法这里使用\write18
包。如第 2 点所述,脚本需要文件的目录.tweet
(.tex 文件的同一目录);为此,我们使用\currfile
包(latex)。重要!\currfile
需要-recorder
执行 latex 时当前文件的完整路径。
然后definetweets
宏运行该twitt.py
脚本。(该脚本需要与 .tex 位于同一目录中)
\def\definetweets{%
\immediate\write18{python \currfileabsdir/twitt.py \currfileabsdir}
}
4. 其他宏
该\tweet
宏使用 bib 字段并打印tweet
文本、date
和username
。
\def\tweet#1{%
\par
\begin{minipage}[t]{0.95\columnwidth}%
\hfill\citetitle{#1}\par
\hfill--\citefield{#1}{nameaddon}, \space\citedate{#1}
\end{minipage}\par}
打印\citetweet
的推文引用类似于您引用的链接中显示的格式。
\def\citetweet#1{%
In a Twitter post on \citedate{#1}, \citeauthor{#1} \mkbibparens{\citefield{#1}{nameaddon}}
wrote, \mkbibquote{\citetitle{#1}}}
这里定义了两种字段格式:title
(tweet)和nameaddon
(username)。第一种格式在标题前面加上“Tweet”一词。第二种格式将用户名放在括号之间,如果hyperref
使用了包,则附加一个指向用户 Twitter 个人资料的链接。
\DeclareFieldFormat{tweet}{Tweet:\space\emph{#1}}
\DeclareFieldFormat{username}{%
\mkbibparens{%
\ifhyperref
{\href{\thefield{addendum}}{#1}}
{#1}}}`
该tweet
驱动程序是biblatex 风格misc
的默认驱动程序authoryear
。(没有未使用的字段)。
\DeclareBibliographyDriver{tweet}{%
\usebibmacro{begentry}%
\setunit{\addcomma\space}
\usebibmacro{author}
\printfield[username]{nameaddon}
\newunit
\setunit{\labelnamepunct}\newblock
\printfield[tweet]{title}%
\newunit\newblock
\printdate
\newunit\newblock
\usebibmacro{url}%
\newunit\newblock
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
\newunit\newblock
\iftoggle{bbx:related}
{\usebibmacro{related:init}%
\usebibmacro{related}}
{}%
\usebibmacro{finentry}}
完整文件。
- 文件
latex
。名称:tweetaddon.tex
\usepackage{download}
\usepackage[abspath]{currfile}[2012/05/06]
\RequirePackage{biblatex}
\def\tweetadd#1{\download[#1.tweet]{https://api.twitter.com/1/statuses/oembed.json?id=#1}}
\def\definetweets{%
\immediate\write18{python \currfileabsdir/twitt.py \currfileabsdir}
}
\def\tweet#1{%
\par
\begin{minipage}[t]{0.95\columnwidth}%
\hfill\citetitle{#1}\par
\hfill--\citefield{#1}{nameaddon}, \space\citedate{#1}
\end{minipage}\par}
\def\citetweet#1{%
In a Twitter post on \citedate{#1}, \citeauthor{#1} \mkbibparens{\citefield{#1}{nameaddon}} wrote, \mkbibquote{\citetitle{#1}}}
\DeclareFieldFormat{tweet}{Twitter post:\space\emph{#1}}
\DeclareFieldFormat{username}{%
\mkbibparens{%
\ifhyperref
{\href{\thefield{addendum}}{#1}}
{#1}}}
%Driver biblatex for tweet
\DeclareBibliographyDriver{tweet}{%
\usebibmacro{begentry}%
\setunit{\addcomma\space}
\usebibmacro{author}
\printfield[username]{nameaddon}
\newunit
\setunit{\labelnamepunct}\newblock
\printfield[tweet]{title}%
\newunit\newblock
\printdate
\newunit\newblock
\usebibmacro{url+urldate}%
\newunit\newblock
\setunit{\bibpagerefpunct}\newblock
\usebibmacro{pageref}%
\newunit\newblock
\iftoggle{bbx:related}
{\usebibmacro{related:init}%
\usebibmacro{related}}
{}%
\usebibmacro{finentry}}
- 文件
python
名称:twitt.py
import json
import re
from bs4 import BeautifulSoup
import os
months={'January':'01','February':'02','March':'03','April':'04','May':'05','June':'06','July':'07','August':'08','September':'09','October':'10','November':'11','December':'12'}
def formatday(day):
if int(day)<10:
day='0'+day
return day
def smplncndtex(string):
chars={'&':'\&','%':'\%','$':'\$','#':'\#','_':'\_','{':'\{','}':'\}'}
for item in chars:
string=string.replace(item,chars[item])
return string
class tweet:
def __init__(self, directory=None,file=None):
self.id=file.replace('.tweet','')
self.file=file
self.get_tweet_filecontent(directory)
self.define_tweet()
self.entrybib=simpleentrybibtex(self).entry
def get_tweet_filecontent(self,directory):
with open(os.path.join(directory,self.file)) as file:
self.filecontent=file.read()
def define_tweet(self):
dcfcnt= json.loads(self.filecontent)
soup=BeautifulSoup(dcfcnt['html'])
self.tweet=unicode(smplncndtex(soup.find('p').text)) #in note
self.author=unicode(smplncndtex(dcfcnt['author_name'])) #in author
self.author_url=dcfcnt['author_url'] #in addendum
self.url=dcfcnt['url'] #in url
username =unicode(smplncndtex('@'+re.match('.+twitter.com/(.+)',self.author_url).group(1))) #in nameaddon
self.username=username
all_a=soup.find_all('a')
for atag in all_a:
if atag.get('href')==self.url.replace('/statuses/','/status/'):
match=re.match('(\w+)\s(\d+),\s(\d+)',atag.text)
#print date_parts
self.date= '%s-%s-%s' % (match.group(3),months[match.group(1)],formatday(match.group(2)))
#print self.date
def save_tweet(self,directory):
with open(os.path.join(directory,self.id)+'.bib','w') as file:
file.write(self.entrybib.encode('utf-8'))
class tweets:
def __init__(self,directory):
self.directory=directory
self.tweets=[]
self.get_tweets()
def get_tweets(self):
for file in os.listdir(self.directory):
if file.endswith(".tweet"):
a=tweet(self.directory,file)
self.tweets.append(a)
class simpleentrybibtex:
def __init__(self,ctt,entryname='tweet'):
self.entry='@%s{tweet:%s,author={%s},title={{%s}},url={%s},nameaddon={{%s}},addendum={%s},date={%s}}' % (entryname,ctt.id,ctt.author,ctt.tweet, ctt.url, ctt.username, ctt.author_url, ctt.date)
if __name__ == "__main__":
import sys
if len(sys.argv) ==1:
print 'It is necessary a directory'
else:
if os.path.exists(sys.argv[1]):
directory=sys.argv[1]
#directory='/home/carlos/latex/teste/testedownload'
tw=tweets(directory)
tex_input=file(os.path.join(directory,'tweetsinputbib.tex'),'w')
for tweet in tw.tweets:
tweet.save_tweet(directory)
tex_input.write('\\addbibresource{%s}\n' % (tweet.id+'.bib'))
else:
print '%s is not a directory' % (sys.argv[1])
妇女权利委员会:
我使用了biblatex
带有authoryear
风格的包。我想你也可以使用biblatex-chicago
。
\documentclass{article}
\usepackage{hyperref}
\usepackage[utf8]{inputenc}
\usepackage[style=authoryear,backend=biber]{biblatex}
\input{tweetaddon} %below of \usepackage{biblatex}
%add the tweet to use between \input{tweetaddon} and \definetweets 382466889332445184 is the id tweet in twitter, get it from url of the tweet.
\tweetadd{382466889332445184}
\tweetadd{382467902751784961}
\definetweets
\input{tweetsinputbib} %input this file that contain the addresource
\begin{document}
A tweet:
\tweet{tweet:382466889332445184}
Other tweet:
\tweet{tweet:382467902751784961}
Or cite a tweet in the form of your link.
\citetweet{tweet:382467902751784961}.
\printbibliography
\end{document}
结果