球拍/涂鸦动态pdf生成

球拍/涂鸦动态pdf生成,pdf,dynamic,racket,scribble,Pdf,Dynamic,Racket,Scribble,大家好,我正在尝试基于全局定义文件中的开关动态构建pdf文件 在文件global_defines.rkt中,我有 #lang racket/base (provide (all-defined-out)) (define alpha #f) (define beta #t) (define gamma #f) 在foo.scrbl文件中 #lang scribble/base @(require "../../pdf_gen/global_defines.rkt") @title{Get

大家好,我正在尝试基于全局定义文件中的开关动态构建pdf文件

在文件global_defines.rkt中,我有

#lang racket/base

(provide (all-defined-out))

(define alpha #f)
(define beta #t)
(define gamma #f)
在foo.scrbl文件中

#lang scribble/base
@(require "../../pdf_gen/global_defines.rkt")

@title{Getting Started}

@if[(or alpha)
        @para{Test text}
        ""]

@if[(or beta)
        (begin
            @dynamic-require["bar.scrbl" 'doc]
            doc)
        ""]
和文件bar.scrbl中

#lang scribble/base
@(require "../../../pdf_gen/global_defines.rkt")
@(provide (all-defined-out))

@title{BAR}

happy marbles
因此,随着开关,因为他们是目前我希望得到类似的东西如下

入门

1.5巴

快乐弹珠


虽然我肯定还有其他方法可以做到这一点,但我更愿意坚持使用scribble,因为它比我现在能想到的其他方法更容易格式化和处理所有事情。我主要关心的是将开关保持在一个位置,并能够拾取和选择由开关处于活动状态触发的内容,因为在多个文档(但不是所有文档)之间存在共同的内容,还有相当一部分内容只属于一两个地方。

虽然这个答案没有我想要的那么优雅,但它确实有效

基本上,我认为你说的是条件编译。在C语言中,可以使用宏来实现这一点。在Racket中,让我们也使用一个宏(一个与C宏一样简单的宏)

我们还需要一个宏,因为Scribble的
include部分是语法(不是函数),必须出现在顶层。因此,您不能在
if
when
中使用它

鉴于:

define.rkt

#lang racket/base

(provide (all-defined-out))

;; Macros to conditionally include literal text.
;; Each of these should return `text`,
;; or (void) for nothing
(define-syntax-rule (when-alpha text)
  text)
(define-syntax-rule (when-beta text)
  (void))

;; Macros to conditionally include a .scrbl file
;; Each of these should return include-section,
;; or (void) for nothing
(require scribble/base) ;for include-section
(define-syntax-rule (when-alpha/include mod-path)
  (include-section mod-path))
(define-syntax-rule (when-beta/include mod-path)
  (void) #;(include-section mod-path))
目前,设置为显示“alpha”的内容,但忽略“beta”的内容。不幸的是,没有简单的
#t
#f
进行切换。正如注释中所解释的那样,您需要对每个文件的正文进行更多的编辑

手动.scrbl示例文件,有条件地包括文本和其他文件

#lang scribble/base
@(require "defines.rkt")
@title{Getting Started}
@when-alpha{@para{Text for alpha}}
@(when-beta/include "includee.scrbl")
includee.scrbl有条件包含的示例文件

#lang scribble/base
@title{BETA TEXT}
I am text for beta version.

我不喜欢这个解决方案的一点是,您必须为每个条件创建/更改一对宏——一个用于包含文字,另一个用于
包含节
-ing.scrbl文件。

我不确定是否理解您的问题。您的示例代码不适合您吗?或者它是有效的,但您正在寻找另一种方法?一个小提示:在foo.scrbl中,您可以使用
when
,而不是
if
,使用显式的
表示假分支。原因:Scribble将处理
(无效)
,就像它是
。不,我的示例代码对我不起作用。我尝试过的大多数变量都会给我一个运行时错误,或者我无法从输出pdf中包含的第二个文件中获取文本。也谢谢你提醒我什么时候使用这个函数,当我开始使用它的时候,它会让事情变得更干净。它会像你说的那样工作。它不太优雅,任何或/和条件都会让设置包含有点痛苦。但是在初始设置之后,我可以很容易地编写一个死脑筋的脚本来为它编写定义文件我我可能还不够清楚,文字文本是有效的,只是文本必须从下游的其他文件中提取,这就是问题所在