在论文提交final script时,一般都要求论文中所有的字体都嵌入到pdf中,一般来说,IEEE提供了一个叫做EXPRESS的工具,可以检查是否符合规范,包括字体是否嵌入。但是,有时候,我们通过latex编译出来的pdf,不能通过EXPRESS检查,并且大部分都是因为字体原因,那么,本文将介绍如何在linux pdflatex编译时能够潜入所有字体。
首先,linux下本身提供了一个检查pdf字体信息的工具,pdffonts。比如查看test.pdf的字体:
pdffonts test.pdf
结果应该是类似下面的:
name type emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
JNARJV+NimbusRomNo9L-Medi Type 1 yes yes no 6 0
NBINYZ+NimbusRomNo9L-Regu Type 1 yes yes no 7 0
CBDPEB+NimbusRomNo9L-ReguItal Type 1 yes yes no 8 0
ZYBBWF+CMSY10 Type 1 yes yes no 9 0
QVCFWU+NimbusRomNo9L-MediItal Type 1 yes yes no 10 0
IJIDBD+CMMI10 Type 1 yes yes no 11 0
MTWRTR+CMR10 Type 1 yes yes no 16 0
Arial TrueType no no no 35 0
Arial,Italic TrueType no no no 36 0
WXQMOP+CMMIB10 Type 1 yes yes no 46 0
Helvetica Type 1 no no no 51 0
DWKNIZ+CMMI7 Type 1 yes yes no 55 0
IXNPPI+CMEX10 Type 1 yes yes no 56 0
EUDIGL+CMR7 Type 1 yes yes no 57 0
CLXNUD+CMSY7 Type 1 yes yes no 58 0
RURLFQ+CMMIB7 Type 1 yes yes no 62 0
LDBHLR+CMBX10 Type 1 yes yes no 63 0
YJCSYX+CMMI5 Type 1 yes yes no 69 0
Helvetica Type 1 no no no 74 0
Helvetica Type 1 no no no 79 0
可以看到,有些字体emb选项为no,表示没有嵌入。 阅读全文…
平时,我们用vimdiff都是基于最大匹配,但有时我们希望能够逐行比较,这个不能直接实现,但是可以通过diff的patchexpr实现,具体介绍可以看vim文档:
http://vimdoc.sourceforge.net/htmldoc/diff.html
下面给出一个vim逐行比较的patch,将下面内容复制到一个文件diffbyline.vim,并且放到plugin目录下(这个脚本是我很早从网络搜到的,现在忘了来源了,哪位看到来源,请告知,我好说明):
" File: diffbyline.vim
" Created: 2010 Sep 28
" Last Change: 2010 Oct 02
" Rev Days: 3
" Author: Andy Wokula <anwoku@yahoo.de>
" :SetLineByLineDiff[!]
"
" set the 'diffexpr' to enable a trivial line-by-line diff algorithm (the
" diff program has no option for this). Reset 'diffexpr' with [!].
com! -bar -bang SetLineByLineDiff call s:SetDiffExpr(<bang>0)
func! s:SetDiffExpr(bang)
if !a:bang
set diffexpr=DiffLineByLine()
echo "'diffexpr' changed to enable line-by-line diff"
else
" XXX restore the previous value
set diffexpr&
echo "'diffexpr' restored"
endif
endfunc
func! DiffLineByLine()
let result = [] " diff output lines
let oldlines = readfile(v:fname_in)
let newlines = readfile(v:fname_new)
let len_oldlines = len(oldlines)
let len_newlines = len(newlines)
let len_common = min([len_oldlines, len_newlines])
" different number of lines allowed
" first common lines -> change(s) only
" rest -> append (er, no, see below)
let idx = 0
let change_start = -1
while idx < len_common
if oldlines[idx] !=# newlines[idx]
" XXX above test is case sensitive and ignores 'diffopt'
if change_start == -1
let change_start = idx
endif
let change_end = idx
elseif change_start >= 0
" line-idx is just after a block of changed lines
" prepare a diff block
if change_start < change_end
let range = (1+change_start). ",". (1+change_end)
else
let range = 1+change_start
endif
let ed_cmd = range. "c". range
call add(result, ed_cmd)
call extend(result, map(oldlines[change_start : change_end], '"< ". v:val'))
call add(result, '---')
call extend(result, map(newlines[change_start : change_end], '"> ". v:val'))
let change_start = -1
endif
let idx += 1
endwhile
if change_start >= 0
" XXX extract to function? (paragraph copied from above)
if change_start < change_end
let range = (1+change_start). ",". (1+change_end)
else
let range = 1+change_start
endif
let ed_cmd = range. "c". range
call add(result, ed_cmd)
call extend(result, map(oldlines[change_start : change_end], '"< ". v:val'))
call add(result, '---')
call extend(result, map(newlines[change_start : change_end], '"> ". v:val'))
endif
if len_oldlines < len_newlines
let append_start = len_oldlines
let append_end = len_newlines - 1
let old_range = append_start " append below this line
if append_start < append_end
let new_range = (1+append_start). ",". (1+append_end)
else
let new_range = 1+append_start
endif
let ed_cmd = old_range. "a". new_range
call add(result, ed_cmd)
call extend(result, map(newlines[append_start : append_end], '"> ". v:val'))
elseif len_oldlines > len_newlines
let delete_start = len_newlines
let delete_end = len_oldlines - 1
let new_range = delete_start " delete below this line
if delete_start < delete_end
let old_range = (1+delete_start). ",". (1+delete_end)
else
let old_range = 1+delete_start
endif
let ed_cmd = old_range. "d". new_range
call add(result, ed_cmd)
call extend(result, map(oldlines[delete_start : delete_end], '"< ". v:val'))
endif
" Decho result
" XXX strange:
echo prints at least two result lists, first is
" ['1c1', '< line1', '---', '> line2'] and belongs nowhere (is this an
" internal diff test by Vim?)
call writefile(result, v:fname_out)
endfunc
使用方法:
- 在diff界面,输入:SetLineByLineDiff,跳到逐行模式,再输入一次,回到普通模式。
- 或者加个SetLineByLineDiff选项,如:vimdiff +SetLineByLineDiff a.c b.c
今天调龙芯模拟器,发现里面有个ld_brk_point,一直不知道是啥东西,后来搜了下,发现就是malloc函数申请空间的起始地址。改值可以通过brk()以及sbrk函数设置。为了说清楚这个问题,有必要先了解下Linux下程序运行时(进程)在内存中的组织。

linux Flexible Address Space Layout
阅读全文…
这段时间折腾某芯片上的SDIO,在这里将相关知识整理下,以便备忘。需要注意的是,由于我们的SD只支持SD模式,不支持SPI模式,因此文中内容也是针对SD模式的,后面不再强调此点。
信号
CLK:时钟信号
CMD:双向命令和响应信号
DAT0-3:双向数据信号
VDD,VSS:电源和地信号
注:SD模式下可以选择总线宽度, 即选用几根DAT信号线(1或4根), 可以在主机初始化后设置.
比特流
SD协议规范的比特流类型有三类:
- 命令: 是在CMD上传输的用于启动一个操作的比特流. 由主机发往从机, 可以是点对点也可以是广播的.
- 响应: 是在CMD上传输的用于之前命令回答的比特流. 由从机发往主机.
- 数据: 是在DAT上传输的比特流, 双向传输.
命令和数据流都有一个开始位和结束位.
命令
SD协议定义了两类命令,广播命令以及点对点命令,
- 广播命令:给所有卡都发送, 某些命令需要响应.
- 点对点命令:给指定地址的卡发送, 需要响应.
工作模式
- 卡识别模式:主机上电复位后即处于此模式,它会在总线上等待卡. 卡复位后也处于此模式, 直到SEND_RCA(CMD3)命令到来.此模式下主机复位总线所有的卡, 验证工作电压, 询问卡的地址. 这个模式下所有数据的传输都是只通过CMD线来完成.
- 数据传输模式:卡收到SEND_RCA(CMD3)命令后即进入此模式. 主机识别到卡后也进入此模式.CMD7命令用于使指定地址的卡进入传输模式, 任何指定时刻只能有一个卡处于传输模式.传输模式下所有的数据传输都是点对点的, 并且所有有地址的命令都需要有响应.
今天,折腾sqlite,需要update一个数据库,发现可以用下面的命令:
UPDATE <table> SET <col=new_val> WHERE <oth_col=val>
但是,在ubuntu里面用apt-get安装sqlite后,直接执行上面的语句,会报“no such module:FTS3”,因为默认sqlite编译是没有启用FTS3的。因此,需要自己下源码编译,手动编译是加入以下编译选项:
-DSQLITE_ENABLE_FTS3
-DSQLITE_ENABLE_FTS3_PARENTHESIS
用autoconf版本的话,在configure时,加入:
CPPFLAGS= "-DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS "/configure <options>
上面两种方法的目的都是一样的,就是在编译时定义SQLITE_ENABLE_FTS3 和SQLITE_ENABLE_FTS3_PARENTHESIS宏。
参考资料:http://www.sqlite.org/fts3.html
近期评论