如何为小册子打印创建重新分页序列作为 pdftk 的输出?

问题描述 投票:0回答:1

我正在创建一个小册子打印工作流程,在打开的跨页上打印 2 页:

  1. 使用 R 创建页面序列
  2. 使用 pdftk 对 pdf 重新分页
  3. 使用 lp 打印 2-up 小册子

我已经编写了一个循环,用于为小册子/骑马订序列重新分页 pdf。对于 8 页的小册子,打印顺序应为“8 1 2 7 6 3 4 5”。我可以在下面的循环中创建序列,但不知道如何将它输出到一行中,每个页码用空格分隔。

p <- 16  # number of pages in a saddle stitch, multiple of 4
p.seq <- c(1:p) # page sequence
p2 <- p/2

for (i in 1:p2) {
  ifelse(p.seq[i] %% 2 == 0, # true if even number
    print(paste(i, p - i + 1, sep=" ")),
    print(paste(p - i + 1, i, sep=" "))
    )
}   

尝试使用

cat(..., append=TRUE)
而不是
print
,但这会停止循环。

r cat pdftk
1个回答
0
投票

试试这个

p <- 16
for (i in seq_len(p/2)) {
  if (i %% 2) cat(c(p - i + 1, i), '')
  else cat(c(i, p - i + 1), '')
}   
# 16 1 2 15 14 3 4 13 12 5 6 11 10 7 8 9 

如果您希望能够保存结果(即不仅仅是

print/cat
ed在控制台上),您可以编写一个函数
f

f <- \(p) unlist(lapply(seq_len(p/2), \(i) {
  if (i %% 2) c(p - i + 1, i)
  else c(i, p - i + 1)
}))

或更多故障保护

f <- \(p) {
  if (is.na(p) || is.null(p)) NULL
  else if (p < 0 || p != round(p)) stop('`p` not a positive round number')
  else if (p == 1) 1
  else {
    unlist(lapply(seq_len(p/2), \(i) {
      if (i %% 2) c(p - i + 1, i)
      else c(i, p - i + 1)
    }))
  }
}
    
f(8)
# [1] 8 1 2 7 6 3 4 5

## `cat`ed
cat(f(8))
# 8 1 2 7 6 3 4 5

f(16)
# [1] 16  1  2 15 14  3  4 13 12  5  6 11 10  7  8  9

f(1)
# [1] 1

f(0); f(NA); f(NULL)
# NULL

f(-3.1); f(-1)
# Error in f(-3.1) : `p` not a positive round number

或者,要存储

for
循环结果,您可以初始化一个列表
res
之后您可以
unlist

p <- 8
res <- vector(mode='list', length=p/2)
for (i in seq_len(p/2)) {
  if (i %% 2) res[[i]] <- c(p - i + 1, i)
  else res[[i]] <- c(i, p - i + 1)
}   
unlist(res)
# [1] 8 1 2 7 6 3 4 5

cat
它:

cat(unlist(res))
# 8 1 2 7 6 3 4 5
© www.soinside.com 2019 - 2024. All rights reserved.